/ Hex Artifact Content
Login

Artifact 99d162e57af6e72ffd7db5bf79568a134cd87d5b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f  >schemaFlags&DB_
1670: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30  SchemaLoaded)==0
1680: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1690: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  1;.  }..  /* Fig
16a0: 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74  ure out the root
16b0: 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20 6c  -page that the l
16c0: 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65  ock should be he
16d0: 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65  ld on. For table
16e0: 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74  .  ** b-trees, t
16f0: 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65 20  his is just the 
1700: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
1710: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65   b-tree being re
1720: 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74  ad or.  ** writt
1730: 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d  en. For index b-
1740: 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68 65  trees, it is the
1750: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1760: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  e associated.  *
1770: 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  * table.  */.  i
1780: 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20  f( isIndex ){.  
1790: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
17a0: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
17b0: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
17c0: 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20  a->idxHash); p; 
17d0: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
17e0: 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  (p)){.      Inde
17f0: 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78  x *pIdx = (Index
1800: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
1810: 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  a(p);.      if( 
1820: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74  pIdx->tnum==(int
1830: 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  )iRoot ){.      
1840: 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70    iTab = pIdx->p
1850: 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20  Table->tnum;.   
1860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1870: 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69  se{.    iTab = i
1880: 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Root;.  }..  /* 
1890: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 72  Search for the r
18a0: 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69  equired lock. Ei
18b0: 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63  ther a write-loc
18c0: 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69  k on root-page i
18d0: 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69  Tab, a .  ** wri
18e0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73  te-lock on the s
18f0: 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20  chema table, or 
1900: 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69  (if the client i
1910: 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a  s reading) a.  *
1920: 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69  * read-lock on i
1930: 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65  Tab will suffice
1940: 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e  . Return 1 if an
1950: 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 66  y of these are f
1960: 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  ound.  */.  for(
1970: 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42  pLock=pBtree->pB
1980: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
1990: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
19a0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  ext){.    if( pL
19b0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74  ock->pBtree==pBt
19c0: 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c  ree .     && (pL
19d0: 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ock->iTable==iTa
19e0: 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f  b || (pLock->eLo
19f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26  ck==WRITE_LOCK &
1a00: 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d  & pLock->iTable=
1a10: 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f  =1)).     && pLo
1a20: 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b  ck->eLock>=eLock
1a30: 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Type .    ){.   
1a40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1a50: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69   }.  }..  /* Fai
1a60: 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  led to find the 
1a70: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a  required lock. *
1a80: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
1a90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1aa0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  _DEBUG */..#ifde
1ab0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1ac0: 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63  *.**** This func
1ad0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64  tion may be used
1ae0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
1af0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b00: 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  only. ****.**.**
1b10: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b20: 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c 65  it would be ille
1b30: 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74  gal for pBtree t
1b40: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
1b50: 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  .** table or ind
1b60: 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52 6f  ex rooted at iRo
1b70: 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65 72  ot because other
1b80: 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69   shared connecti
1b90: 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75 6c  ons are.** simul
1ba0: 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69 6e  taneously readin
1bb0: 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62 6c  g that same tabl
1bc0: 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e or index..**.*
1bd0: 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
1be0: 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72  for pBtree to wr
1bf0: 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ite if some othe
1c00: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 74  r Btree object t
1c10: 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74 68  hat.** shares th
1c20: 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64 20  e same BtShared 
1c30: 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65 6e  object is curren
1c40: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 77  tly reading or w
1c50: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69 52  riting.** the iR
1c60: 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63 65  oot table.  Exce
1c70: 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65 72  pt, if the other
1c80: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68 61   Btree object ha
1c90: 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75 6e  s the.** read-un
1ca0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
1cb0: 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 4f  et, then it is O
1cc0: 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 20  K for the other 
1cd0: 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61 76  object to.** hav
1ce0: 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72 2e  e a read cursor.
1cf0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1d00: 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74 69  le, before writi
1d10: 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20 6f  ng to any part o
1d20: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
1d30: 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20 61  ndex.** rooted a
1d40: 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f 6e  t page iRoot, on
1d50: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a 2a  e should call:.*
1d60: 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20  *.**    assert( 
1d70: 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
1d80: 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 29  s(pBtree, iRoot)
1d90: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
1da0: 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63  t hasReadConflic
1db0: 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  ts(Btree *pBtree
1dc0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20  , Pgno iRoot){. 
1dd0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1de0: 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1df0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1e00: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1e10: 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1e20: 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26 20  =iRoot .     && 
1e30: 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72 65  p->pBtree!=pBtre
1e40: 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70 2d  e.     && 0==(p-
1e50: 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61  >pBtree->db->fla
1e60: 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64  gs & SQLITE_Read
1e70: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20 20  Uncommitted).   
1e80: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e90: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1ea0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1eb0: 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20  if    /* #ifdef 
1ec0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1ed0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
1ee0: 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61 6e  see if Btree han
1ef0: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
1f00: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
1f10: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
1f20: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
1f30: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
1f40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
1f50: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
1f60: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
1f70: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
1f80: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
1f90: 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61  g.** setSharedCa
1fa0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c  cheTableLock()),
1fb0: 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   or SQLITE_LOCKE
1fc0: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
1fd0: 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61  tic int querySha
1fe0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1ff0: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2000: 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29   iTab, u8 eLock)
2010: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2020: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
2030: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2040: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2050: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2060: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2070: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2080: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2090: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
20a0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  ( p->db!=0 );.  
20b0: 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d  assert( !(p->db-
20c0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
20d0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c 7c  adUncommitted)||
20e0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
20f0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
2100: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
2110: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2120: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2130: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2140: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2150: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2160: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2170: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2180: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2190: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
21a0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
21b0: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
21c0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
21d0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
21e0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
21f0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
2200: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
2210: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2220: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2230: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2240: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2250: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2260: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2270: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2280: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2290: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
22a0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
22b0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
22c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
22e0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
22f0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
2300: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2310: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2320: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2330: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2340: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2350: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2360: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2370: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2390: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
23a0: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
23b0: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
23c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
23d0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
23e0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
23f0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2400: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2410: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2420: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2430: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2440: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2450: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2460: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2470: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2480: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2490: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
24a0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
24b0: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
24c0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
24d0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
24e0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
24f0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
2500: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
2510: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2520: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2530: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2540: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2550: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2560: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2570: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2580: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2590: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
25a0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
25b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
25c0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
25d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
25e0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
25f0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
2600: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2610: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2620: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2630: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2640: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2650: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2660: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2670: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2680: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2690: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
26a0: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
26b0: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
26c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
26d0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
26e0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
26f0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
2700: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
2710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2720: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2730: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2750: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2770: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2780: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2790: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
27a0: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
27b0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
27c0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
27d0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
27e0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
27f0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
2800: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
2810: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2820: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2830: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2840: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2850: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2860: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2870: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2880: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2890: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
28a0: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
28b0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
28c0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
28d0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
28e0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
28f0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
2900: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
2910: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2920: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2930: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2940: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2950: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2960: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2970: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2980: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2990: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
29a0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
29b0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29c0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
29d0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
29e0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
29f0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2a00: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2a10: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2a20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2a30: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a40: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2a50: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2a60: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2a70: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2a80: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2a90: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2aa0: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2ab0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ac0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2ad0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2ae0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2af0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2b00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2b10: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2b20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2b30: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2b40: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2b50: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2b60: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2b70: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2b80: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2b90: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2ba0: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2bb0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2bc0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2bd0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2be0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2bf0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2c00: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2c10: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2c20: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2c30: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2c40: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2c50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2c60: 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  d) || eLock==WRI
2c70: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  TE_LOCK );..  /*
2c80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2c90: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2ca0: 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62  lled on a sharab
2cb0: 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20  le b-tree after 
2cc0: 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  it .  ** has bee
2cd0: 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  n determined tha
2ce0: 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65  t no other b-tre
2cf0: 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69  e holds a confli
2d00: 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a  cting lock.  */.
2d10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61    assert( p->sha
2d20: 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  rable );.  asser
2d30: 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75  t( SQLITE_OK==qu
2d40: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
2d50: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
2d60: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
2d70: 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20  /* First search 
2d80: 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20  the list for an 
2d90: 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e  existing lock on
2da0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
2db0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
2dc0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2dd0: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2de0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  t){.    if( pIte
2df0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
2e00: 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72  e && pIter->pBtr
2e10: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70  ee==p ){.      p
2e20: 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20  Lock = pIter;.  
2e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2e50: 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64  e above search d
2e60: 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74  id not find a Bt
2e70: 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f  Lock struct asso
2e80: 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a  ciating Btree p.
2e90: 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20    ** with table 
2ea0: 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65  iTable, allocate
2eb0: 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74   one and link it
2ec0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a   into the list..
2ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63    */.  if( !pLoc
2ee0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  k ){.    pLock =
2ef0: 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74   (BtLock *)sqlit
2f00: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
2f10: 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20  eof(BtLock));.  
2f20: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
2f30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2f50: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  .    pLock->iTab
2f60: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
2f70: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d   pLock->pBtree =
2f80: 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70   p;.    pLock->p
2f90: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
2fa0: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63  k;.    pBt->pLoc
2fb0: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = pLock;.  }..
2fc0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c    /* Set the BtL
2fd0: 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ock.eLock variab
2fe0: 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  le to the maximu
2ff0: 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  m of the current
3000: 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74   lock.  ** and t
3010: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
3020: 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  k. This means if
3030: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61   a write-lock wa
3040: 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20  s already held. 
3050: 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c   ** and a read-l
3060: 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77  ock requested, w
3070: 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63  e don't incorrec
3080: 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68  tly downgrade th
3090: 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61  e lock..  */.  a
30a0: 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43  ssert( WRITE_LOC
30b0: 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20  K>READ_LOCK );. 
30c0: 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b   if( eLock>pLock
30d0: 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ->eLock ){.    p
30e0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c  Lock->eLock = eL
30f0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ock;.  }..  retu
3100: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3110: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
3120: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3130: 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
3140: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3150: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52  ED_CACHE./*.** R
3160: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74  elease all the t
3170: 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b  able locks (lock
3180: 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63  s obtained via c
3190: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73  alls to.** the s
31a0: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
31b0: 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75  leLock() procedu
31c0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
31d0: 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a  e object p..**.*
31e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72  assumes that Btr
3200: 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e  ee p has an open
3210: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a   read or write .
3220: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3230: 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20  If it does not, 
3240: 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e  then the BTS_PEN
3250: 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79  DING flag.** may
3260: 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   be incorrectly 
3270: 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
3280: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c  ic void clearAll
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
32b0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32c0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
32d0: 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26  ock **ppIter = &
32e0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61  pBt->pLock;..  a
32f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
3300: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
3310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3320: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d  >sharable || 0==
3330: 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73  *ppIter );.  ass
3340: 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
3350: 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  0 );..  while( *
3360: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
3370: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
3380: 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72  pIter;.    asser
3390: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
33a0: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
33b0: 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  E)==0 || pBt->pW
33c0: 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42  riter==pLock->pB
33d0: 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65  tree );.    asse
33e0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  rt( pLock->pBtre
33f0: 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63  e->inTrans>=pLoc
3400: 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k->eLock );.    
3410: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
3420: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
3430: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
3440: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Next;.      asse
3450: 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  rt( pLock->iTabl
3460: 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26  e!=1 || pLock==&
3470: 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  p->lock );.     
3480: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62   if( pLock->iTab
3490: 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  le!=1 ){.       
34a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
34b0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ock);.      }.  
34c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
34d0: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
34e0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
34f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ..  assert( (pBt
3500: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3510: 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20  _PENDING)==0 || 
3520: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
3530: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3540: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74  er==p ){.    pBt
3550: 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20  ->pWriter = 0;. 
3560: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3570: 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53   &= ~(BTS_EXCLUS
3580: 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29  IVE|BTS_PENDING)
3590: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
35a0: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
35b0: 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =2 ){.    /* Thi
35c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
35d0: 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20  lled when Btree 
35e0: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
35f0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
3600: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
3610: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
3620: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
3630: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
3640: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3650: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3660: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3670: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3680: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3690: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
36a0: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
36b0: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
36c0: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
36d0: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
36e0: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
36f0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
3700: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
3710: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
3720: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73   BTS_PENDING mus
3730: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3740: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3750: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3760: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3770: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3780: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3790: 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a  = ~BTS_PENDING;.
37a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
37b0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67  s function chang
37c0: 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63  es all write-loc
37d0: 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  ks held by Btree
37e0: 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63   p into read-loc
37f0: 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ks..*/.static vo
3800: 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  id downgradeAllS
3810: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
3820: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
3830: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3840: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
3850: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3860: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3870: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
3880: 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Writer = 0;.    
3890: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
38a0: 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45   ~(BTS_EXCLUSIVE
38b0: 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20  |BTS_PENDING);. 
38c0: 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74     for(pLock=pBt
38d0: 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20  ->pLock; pLock; 
38e0: 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65  pLock=pLock->pNe
38f0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
3900: 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d  t( pLock->eLock=
3910: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c  =READ_LOCK || pL
3920: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3930: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65  ;.      pLock->e
3940: 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
3950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
3960: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3970: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3980: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
3990: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
39a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
39b0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
39c0: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
39d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
39e0: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
39f0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3a00: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3a10: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3a20: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3a30: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3a40: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3a50: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3a60: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3a70: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3a80: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3a90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3aa0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
3ab0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3ac0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3ad0: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3ae0: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3af0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3b00: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3b10: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3b20: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3b30: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3b40: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3b50: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3b60: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3b70: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3b80: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3b90: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3ba0: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3bb0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3bc0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3bd0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3be0: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3bf0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3c00: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3c10: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3c20: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3c30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3c50: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3c60: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3c70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3c80: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
3c90: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
3ca0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3cb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
3cc0: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
3cd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3ce0: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
3cf0: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
3d00: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
3d10: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
3d20: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
3d30: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
3d40: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
3d50: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
3d60: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
3d70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
3d80: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
3d90: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
3da0: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
3db0: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
3dc0: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
3dd0: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
3de0: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
3df0: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
3e00: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
3e10: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
3e20: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
3e30: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
3e40: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
3e50: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
3e60: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3e70: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
3e80: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
3e90: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
3ea0: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
3eb0: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
3ec0: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
3ed0: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
3ee0: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
3ef0: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
3f00: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
3f10: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3f20: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
3f30: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
3f40: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
3f50: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
3f60: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
3f70: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
3f80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
3f90: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
3fa0: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
3fb0: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
3fc0: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
3fd0: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
3fe0: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
3ff0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4000: 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
4010: 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
4020: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
4030: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
4040: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
4050: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
4060: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
4070: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  xt){.    if( (p-
4080: 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
4090: 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 26 26  _Incrblob)!=0 &&
40a0: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
40b0: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
40c0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
40d0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
40e0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
40f0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
4100: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
4110: 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69   when INCRBLOB i
4120: 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23  s omitted */.  #
4130: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
4140: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
4150: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
4160: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
4170: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
4180: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
4190: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
41a0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
41b0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
41c0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
41d0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
41e0: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
41f0: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
4200: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
4210: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
4220: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4230: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
4240: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
4250: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
4260: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
4270: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
4280: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
4290: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
42a0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
42b0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
42c0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
42d0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
42e0: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
42f0: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
4300: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
4310: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4320: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
4330: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
4340: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
4350: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
4360: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
4370: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
4380: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
4390: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
43a0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
43b0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
43c0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
43d0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
43e0: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
43f0: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4400: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4410: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4420: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4430: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4440: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4450: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4460: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4470: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4480: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
4490: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
44a0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
44b0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
44c0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
44d0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
44e0: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
44f0: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4500: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4510: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4520: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4530: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4540: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4550: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4560: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4570: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
4580: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
4590: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
45a0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
45b0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
45c0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
45d0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
45e0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
45f0: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4600: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4610: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4620: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4630: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4640: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4650: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4660: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4670: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
4680: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
4690: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
46a0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
46b0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
46c0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
46d0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
46e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
46f0: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4700: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4710: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4720: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4730: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4740: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4750: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4760: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4770: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
4780: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
4790: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
47a0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
47b0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
47c0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
47d0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
47e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
47f0: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4800: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4810: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4820: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4830: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4840: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4850: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4860: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4870: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
4880: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4890: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
48a0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
48b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
48c0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
48d0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
48e0: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
48f0: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4900: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4910: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4920: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4930: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4940: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4950: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4960: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4970: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4980: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
4990: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
49a0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49b0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
49c0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
49d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
49e0: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
49f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4a00: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4a10: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4a20: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4a30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4a40: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4a50: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4a60: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4a70: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
4a80: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
4a90: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
4aa0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
4ab0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
4ac0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
4ad0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4ae0: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
4af0: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
4b00: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
4b10: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
4b20: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4b30: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
4b40: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
4b50: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
4b60: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
4b70: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
4b80: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
4b90: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
4ba0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
4bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
4bc0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
4bd0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4be0: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
4bf0: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
4c00: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
4c10: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
4c20: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
4c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4c40: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
4c50: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4c60: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
4c70: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
4c80: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
4c90: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ca0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
4cb0: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20   Release all of 
4cc0: 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67  the apPage[] pag
4cd0: 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e  es for a cursor.
4ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4cf0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
4d00: 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75 72  ursorPages(BtCur
4d10: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4d20: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4d30: 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
4d40: 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
4d50: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
4d60: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72  ge[i]);.    pCur
4d70: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4d80: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61  .  }.  pCur->iPa
4d90: 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ge = -1;.}.../*.
4da0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
4db0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
4dc0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
4dd0: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
4de0: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
4df0: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
4e00: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
4e10: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
4e20: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
4e30: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
4e40: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
4e50: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
4e60: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
4e70: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
4e80: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
4e90: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
4ea0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
4eb0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
4ec0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4ed0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
4ee0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
4ef0: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
4f00: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
4f10: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
4f20: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
4f30: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
4f40: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
4f50: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
4f60: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
4f70: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
4f80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
4f90: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
4fa0: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
4fb0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
4fc0: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
4fd0: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
4fe0: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
4ff0: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5000: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5010: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
5020: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
5030: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
5040: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
5050: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
5060: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
5070: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5080: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5090: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
50a0: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
50b0: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
50c0: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
50d0: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
50e0: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
50f0: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5100: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5110: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69  qlite3Malloc( (i
5120: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b  nt)pCur->nKey );
5130: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
5140: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5150: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
5160: 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e  , 0, (int)pCur->
5170: 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20  nKey, pKey);.   
5180: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5190: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
51a0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65  pCur->pKey = pKe
51b0: 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
51c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
51d0: 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20  free(pKey);.    
51e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
51f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5200: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5210: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
5220: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5230: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
5240: 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Key );..  if( rc
5250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5260: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
5270: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
5280: 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  ur);.    pCur->e
5290: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
52a0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
52b0: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
52c0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
52d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
52e0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
52f0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5300: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5310: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5320: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5330: 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72  he table  with r
5340: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
5350: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
5360: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
5370: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
5380: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5390: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
53a0: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
53b0: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
53c0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
53d0: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
53e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
53f0: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
5400: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
5410: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
5420: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5430: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5440: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5450: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
5460: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
5470: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
5480: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
5490: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
54a0: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
54b0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
54c0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
54d0: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  oot) ){.      if
54e0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
54f0: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5500: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
5510: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5520: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
5530: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
5540: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5550: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
5560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5570: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5580: 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  p->iPage>0 );.  
5590: 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
55a0: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
55b0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
55c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
55d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
55e0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
55f0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5600: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
5610: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
5620: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
5630: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
5640: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
5650: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
5660: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
5670: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
5680: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
5690: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
56a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
56b0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
56c0: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
56d0: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
56e0: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
56f0: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
5700: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
5710: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
5720: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
5730: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
5740: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
5750: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
5760: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
5770: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5780: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
5790: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
57a0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
57b0: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
57c0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
57d0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
57e0: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
57f0: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
5800: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
5810: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
5820: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
5830: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
5840: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
5850: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
5860: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
5870: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
5880: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
5890: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
58a0: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
58b0: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
58c0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
58d0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
58f0: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
5900: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
5910: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
5920: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
5930: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
5940: 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20  e[200];         
5950: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
5960: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
5970: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
5980: 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20  /.  char *pFree 
5990: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79  = 0;..  if( pKey
59a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
59b0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
59c0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
59d0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
59e0: 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
59f0: 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43  cord(.        pC
5a00: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53  ur->pKeyInfo, aS
5a10: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
5a20: 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20  ace), &pFree.   
5a30: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
5a40: 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
5a50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
5a70: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
5a80: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
5a90: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
5aa0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
5ab0: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
5ac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5ad0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
5ae0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
5af0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5b00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
5b10: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  KPT;.    }.  }el
5b20: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
5b30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
5b40: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
5b50: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
5b60: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
5b70: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
5b80: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
5b90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
5ba0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
5bb0: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
5bc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5bd0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
5be0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
5bf0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
5c00: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
5c10: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
5c20: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
5c30: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
5c40: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
5c50: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
5c60: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
5c70: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
5c80: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
5c90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
5ca0: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
5cb0: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
5cc0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
5cd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5ce0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
5cf0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
5d00: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
5d10: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
5d20: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5d30: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5d40: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5d50: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
5d60: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5d70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
5d80: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
5d90: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
5da0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5db0: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
5dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5dd0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
5de0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
5df0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
5e00: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
5e10: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
5e20: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
5e30: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
5e40: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
5e50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5e70: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5e80: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5e90: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5ea0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5eb0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ec0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5ed0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
5ee0: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
5ef0: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
5f00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5f10: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
5f20: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5f30: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
5f40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5f50: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5f60: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5f70: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5f80: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5f90: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5fa0: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5fb0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5fc0: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5fd0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5fe0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5ff0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6000: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6010: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6020: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
6030: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
6040: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6050: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6060: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
6070: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6080: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
60a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
60b0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
60c0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
60d0: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
60e0: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
60f0: 73 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  s set as follows
6100: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 20  :.**.**    0:   
6110: 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 6e  The cursor is un
6120: 63 68 61 6e 67 65 64 0a 2a 2a 20 20 20 20 31 3a  changed.**    1:
6130: 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
6140: 20 73 74 69 6c 6c 20 70 6f 69 6e 74 69 6e 67 20   still pointing 
6150: 61 74 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2c  at the same row,
6160: 20 62 75 74 20 74 68 65 20 70 6f 69 6e 74 65 72   but the pointer
6170: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 74  s.**         ret
6180: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
6190: 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 29 20  BtreeKeyFetch() 
61a0: 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  or sqlite3BtreeD
61b0: 61 74 61 46 65 74 63 68 28 29 0a 2a 2a 20 20 20  ataFetch().**   
61c0: 20 20 20 20 20 20 6d 69 67 68 74 20 6e 6f 77 20        might now 
61d0: 62 65 20 69 6e 76 61 6c 69 64 20 62 65 63 61 75  be invalid becau
61e0: 73 65 20 6f 66 20 61 20 62 61 6c 61 6e 63 65 28  se of a balance(
61f0: 29 20 6f 72 20 6f 74 68 65 72 20 63 68 61 6e 67  ) or other chang
6200: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  e to the.**     
6210: 20 20 20 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 20      b-tree..**  
6220: 20 20 32 3a 20 20 20 54 68 65 20 63 75 72 73 6f    2:   The curso
6230: 72 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 70  r is no longer p
6240: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 72  ointing to the r
6250: 6f 77 2e 20 20 54 68 65 20 72 6f 77 20 6d 69 67  ow.  The row mig
6260: 68 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20  ht have.**      
6270: 20 20 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20     been deleted 
6280: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
6290: 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 69 6e  he cursor..*/.in
62a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
62b0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
62c0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
62d0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
62e0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
62f0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6300: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6310: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b   *pHasMoved = 0;
6320: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6330: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
6340: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
6350: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
6360: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
6370: 70 48 61 73 4d 6f 76 65 64 20 3d 20 32 3b 0a 20  pHasMoved = 2;. 
6380: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6390: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
63a0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
63b0: 49 44 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72  ID || NEVER(pCur
63c0: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29  ->skipNext!=0) )
63d0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
63e0: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
63f0: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
6400: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6410: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
6420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6430: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
6440: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
6450: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
6460: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
6470: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
6480: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
6490: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
64a0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
64b0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
64c0: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
64d0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
64e0: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
64f0: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
6500: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
6510: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
6520: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
6530: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
6540: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
6550: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
6560: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
6570: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
6580: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
6590: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
65a0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
65b0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
65c0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
65d0: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
65e0: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
65f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6600: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6610: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
6620: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
6630: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6640: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
6650: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
6660: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
6670: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
6680: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
6690: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
66a0: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
66b0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
66c0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
66d0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
66e0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
66f0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
6700: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
6710: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6720: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
6730: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
6740: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6750: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
6760: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
6770: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
6780: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
6790: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
67a0: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
67b0: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
67c0: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
67d0: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
67e0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
67f0: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
6800: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
6810: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6820: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
6830: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
6840: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6850: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
6860: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6870: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
6880: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
6890: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
68a0: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
68b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
68c0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
68d0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
68e0: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
68f0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
6900: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
6910: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
6920: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
6930: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
6940: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
6950: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6960: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
6970: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
6980: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
6990: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
69a0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
69b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
69c0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
69d0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
69e0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
69f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
6a00: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
6a10: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
6a20: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
6a30: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
6a40: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
6a50: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
6a60: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
6a70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
6a80: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
6a90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6aa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6ab0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
6ac0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
6ad0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6ae0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6af0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6b00: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6b10: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6b20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6b30: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
6b40: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
6b50: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
6b60: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
6b70: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
6b80: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
6b90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6ba0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6bb0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
6bc0: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
6bd0: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6be0: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6bf0: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
6c00: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6c10: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6c20: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6c30: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6c40: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
6c50: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6c60: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
6c70: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
6c80: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
6c90: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
6ca0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6cb0: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
6cc0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6cd0: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6ce0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6cf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6d00: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6d10: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6d20: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6d30: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
6d50: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
6d60: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6d70: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
6d80: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
6d90: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
6da0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6db0: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
6dc0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6dd0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6de0: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6df0: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6e00: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6e10: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6e20: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6e30: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6e40: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6e50: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
6e60: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
6e70: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
6e80: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6e90: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
6ea0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6eb0: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6ec0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6ed0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6ee0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6ef0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6f00: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6f10: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6f20: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6f30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6f40: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6f50: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
6f60: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6f70: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6f80: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
6f90: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
6fa0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6fb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6fc0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6fd0: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6fe0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6ff0: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
7000: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
7010: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
7020: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
7030: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
7040: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7050: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
7060: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
7070: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
7080: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
7090: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
70a0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
70b0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
70c0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
70d0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
70e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
70f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7100: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
7110: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
7120: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
7130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
7140: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
7150: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
7160: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
7170: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
7180: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7190: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
71a0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
71b0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
71c0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
71d0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
71e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
71f0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
7200: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
7210: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
7220: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7230: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
7240: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
7250: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
7260: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
7270: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
7280: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
7290: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
72a0: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
72b0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
72c0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
72d0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
72e0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
72f0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
7300: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
7310: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
7320: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
7330: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
7340: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
7350: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7360: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
7370: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
7380: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
7390: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
73a0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
73b0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
73c0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
73d0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
73e0: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
73f0: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
7400: 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d  e findCellv2(D,M
7410: 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32  ,O,I) (D+(M&get2
7420: 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29  byte(D+(O+2*(I))
7430: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
7440: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
7450: 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43  version of findC
7460: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
7470: 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68   for.** pages th
7480: 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76  at do contain ov
7490: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
74a0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
74b0: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
74c0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
74d0: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
74e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
74f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7500: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
7510: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
7520: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
7530: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
7540: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20   int k;.    k = 
7550: 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d  pPage->aiOvfl[i]
7560: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
7570: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
7580: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
7590: 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
75a0: 2d 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  ->apOvfl[i];.   
75b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
75c0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
75d0: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
75e0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
75f0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
7600: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
7610: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
7620: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
7630: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
7640: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
7650: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
7660: 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43  on.  btreeParseC
7670: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
7680: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
7690: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
76a0: 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72  ent and btreePar
76b0: 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20  seCellPtr() .** 
76c0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
76d0: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
76e0: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
76f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
7700: 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  **.** Within thi
7710: 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73  s file, the pars
7720: 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61  eCell() macro ca
7730: 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  n be called inst
7740: 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50  ead of.** btreeP
7750: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
7760: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
7770: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
7780: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61  e faster..*/.sta
7790: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
77a0: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
77b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
77c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
77d0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
77e0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
77f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7800: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
7810: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
7820: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7830: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7840: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7850: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e  re */.){.  u16 n
7860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7870: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
7880: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
7890: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
78a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
78b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
78c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
78d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
78e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
78f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7900: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7910: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
7920: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
7930: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
7940: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
7950: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
7960: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7970: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
7980: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
7990: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
79a0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
79b0: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
79c0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
79d0: 28 20 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( n==0 );.      
79e0: 6e 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  n = getVarint32(
79f0: 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f 61 64 29  pCell, nPayload)
7a00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7a10: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
7a20: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
7a30: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
7a40: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
7a50: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
7a60: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
7a70: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
7a80: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7a90: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
7aa0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
7ab0: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
7ac0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
7ad0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7ae0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
7af0: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
7b00: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
7b10: 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28  = n;.  testcase(
7b20: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
7b30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
7b40: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
7b50: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
7b60: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c  cal+1 );.  if( l
7b70: 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d  ikely(nPayload<=
7b80: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29  pPage->maxLocal)
7b90: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
7ba0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
7bb0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
7bc0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
7bd0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
7be0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
7bf0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
7c00: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
7c10: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66  */.    if( (pInf
7c20: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
7c30: 28 6e 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20  (n+nPayload))<4 
7c40: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
7c50: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
7c60: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
7c70: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
7c80: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
7c90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7ca0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
7cb0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
7cc0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
7cd0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
7ce0: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
7cf0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
7d00: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
7d10: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
7d20: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
7d30: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7d40: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
7d50: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
7d60: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
7d70: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
7d80: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
7d90: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
7da0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
7db0: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
7dc0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
7dd0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
7de0: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
7df0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
7e00: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
7e10: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
7e20: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
7e30: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
7e40: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
7e50: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
7e60: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
7e70: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
7e80: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
7e90: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7ea0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7eb0: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
7ec0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
7ed0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7ee0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7ef0: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
7f00: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
7f10: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
7f20: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
7f30: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
7f40: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7f50: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
7f60: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7f70: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
7f80: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
7f90: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
7fa0: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
7fb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7fc0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
7fd0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
7fe0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
7ff0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8000: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8010: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
8020: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
8030: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8040: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
8050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8060: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8070: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8080: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
8090: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
80a0: 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  16)(pInfo->nLoca
80b0: 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66  l + n);.    pInf
80c0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
80d0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
80e0: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70  .  }.}.#define p
80f0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
8100: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a  iCell, pInfo) \.
8110: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8120: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
8130: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
8140: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
8150: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  ).static void bt
8160: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
8170: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8180: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8190: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
81a0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
81b0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
81c0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
81d0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
81e0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
81f0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8200: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8210: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8220: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
8230: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
8240: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
8250: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
8260: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
8270: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
8280: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
8290: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
82a0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
82b0: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
82c0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
82d0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
82e0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
82f0: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
8300: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
8310: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
8320: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
8330: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
8340: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
8350: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
8360: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
8370: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
8380: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
8390: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
83a0: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
83b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
83c0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
83d0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
83e0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
83f0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
8400: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
8410: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
8420: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
8430: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
8440: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
8450: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
8460: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
8470: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
8480: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
8490: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
84a0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
84b0: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
84c0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
84d0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
84e0: 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72  info;.  btreePar
84f0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
8500: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
8510: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
8520: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
8530: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
8540: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
8550: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
8560: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8570: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
8580: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
8590: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
85a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
85b0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
85c0: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
85d0: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
85e0: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
85f0: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
8600: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
8610: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
8620: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
8630: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
8640: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
8650: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
8660: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
8670: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8680: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8690: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
86a0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
86b0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
86c0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
86d0: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
86e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
86f0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8700: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8710: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8720: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8730: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
8740: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
8750: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
8760: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8770: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
8780: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
8790: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
87a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
87b0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
87c0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
87d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
87e0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
87f0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8800: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8810: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
8820: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8830: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
8840: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
8850: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
8860: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
8870: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8880: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
8890: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
88a0: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
88b0: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
88c0: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
88d0: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
88e0: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
88f0: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
8900: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
8910: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8920: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
8930: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
8940: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
8950: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
8960: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
8970: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
8980: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
8990: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
89a0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
89b0: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
89c0: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
89d0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
89e0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
89f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8a00: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
8a10: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
8a20: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
8a30: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
8a40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
8a50: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
8a60: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
8a70: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
8a80: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
8a90: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
8aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8ab0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8ac0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8ad0: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
8ae0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
8af0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
8b00: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
8b10: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
8b20: 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
8b30: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
8b40: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
8b50: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
8b60: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
8b70: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
8b80: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
8b90: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
8ba0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
8bb0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
8bc0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
8bd0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
8be0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
8bf0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
8c00: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
8c10: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
8c20: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
8c30: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
8c40: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
8c50: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
8c60: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
8c70: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
8c80: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
8c90: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
8ca0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
8cb0: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
8cc0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
8cd0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
8ce0: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
8cf0: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
8d00: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
8d10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
8d20: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
8d30: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8d40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8d60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
8d70: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
8d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8d90: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
8da0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
8db0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
8dc0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
8dd0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
8de0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
8e10: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
8e20: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
8e30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8e40: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
8e50: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
8e60: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
8e70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8e80: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
8e90: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
8ea0: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8ec0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
8ed0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
8ee0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
8f10: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
8f20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8f30: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
8f40: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
8f50: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8f60: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
8f70: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
8f80: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
8f90: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
8fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8fb0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
8fc0: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
8fd0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
8ff0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
9000: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
9010: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9020: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9030: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9040: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9050: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
9060: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9070: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
9080: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9090: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
90a0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
90b0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
90c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
90d0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
90e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
90f0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
9100: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
9110: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
9120: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
9130: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
9140: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
9150: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
9160: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
9170: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
9180: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
9190: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
91a0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
91b0: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
91c0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
91d0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
91e0: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
91f0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9200: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72  memcpy(&temp[cbr
9210: 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
9220: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62   usableSize - cb
9230: 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  rk);.  cbrk = us
9240: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
9250: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
9260: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
9270: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
9280: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
9290: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
92a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
92b0: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
92c0: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
92d0: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
92e0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
92f0: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
9300: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
9310: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
9320: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
9330: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
9340: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
9350: 20 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   );.#if !defined
9360: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
9370: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
9380: 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65  CK).    /* These
9390: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
93a0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
93b0: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
93c0: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
93d0: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
93e0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
93f0: 43 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64  CHECK is defined
9400: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
9410: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
9420: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
9430: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9440: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9450: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  PT;.    }.#endif
9460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
9470: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
9480: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
9490: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
94a0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
94b0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
94c0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20  rk -= size;.#if 
94d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
94e0: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
94f0: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69  ELL_CHECK).    i
9500: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
9510: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9520: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9530: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9540: 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b  lse.    if( cbrk
9550: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
9560: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
9570: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
9580: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9590: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
95a0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
95b0: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
95c0: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
95d0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
95e0: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
95f0: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
9600: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9610: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
9620: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d  eSize );.    mem
9630: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
9640: 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65   &temp[pc], size
9650: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
9660: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
9670: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
9680: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
9690: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
96a0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
96b0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
96c0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
96d0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
96e0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
96f0: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
9700: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
9710: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
9720: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9730: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9740: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9750: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
9760: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
9770: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
9780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9790: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
97a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
97b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
97c0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
97d0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
97e0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
97f0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
9800: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9810: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
9820: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
9830: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
9840: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
9850: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
9860: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
9870: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
9880: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
9890: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
98a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
98b0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
98c0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
98d0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
98e0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
98f0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
9900: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
9910: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
9920: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
9930: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
9940: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
9950: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
9960: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
9970: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
9980: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
9990: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
99a0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
99b0: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
99c0: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
99d0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
99e0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
99f0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
9a00: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
9a10: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
9a20: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
9a30: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
9a40: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
9a50: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
9a60: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
9a70: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
9a80: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
9a90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9aa0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
9ab0: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
9ac0: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
9ad0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
9ae0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
9af0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
9b00: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
9b10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b   */.  int nFrag;
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9b40: 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74  mber of fragment
9b50: 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67  ed bytes on pPag
9b60: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  e */.  int top; 
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9b90: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
9ba0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
9bb0: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
9bc0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
9bd0: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
9be0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
9bf0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
9c00: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
9c10: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
9c20: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
9c30: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
9c40: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
9c50: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
9c60: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
9c70: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
9c80: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
9c90: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
9ca0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
9cb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9cc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9cd0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
9cf0: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
9d00: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
9d10: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
9d20: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
9d30: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
9d40: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
9d50: 77 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65  w==0 );.  usable
9d60: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
9d70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
9d80: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
9d90: 20 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b   usableSize-8 );
9da0: 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61  ..  nFrag = data
9db0: 5b 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72  [hdr+7];.  asser
9dc0: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
9dd0: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
9de0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
9df0: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
9e00: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
9e10: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
9e20: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9e30: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
9e40: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70  r+5]);.  if( gap
9e50: 3e 74 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51  >top ) return SQ
9e60: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9e70: 54 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  T;.  testcase( g
9e80: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
9e90: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
9ea0: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9eb0: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a  e( gap==top );..
9ec0: 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20    if( nFrag>=60 
9ed0: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  ){.    /* Always
9ee0: 20 64 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68   defragment high
9ef0: 6c 79 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61  ly fragmented pa
9f00: 67 65 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ges */.    rc = 
9f10: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
9f20: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
9f30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9f40: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
9f50: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
9f60: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
9f70: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
9f80: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
9f90: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
9fa0: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
9fb0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9fc0: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9fd0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9fe0: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9ff0: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
a000: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
a010: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
a020: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
a030: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
a040: 6d 6d 6f 64 61 74 65 20 69 74 2e 0a 20 20 20 20  mmodate it..    
a050: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
a060: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
a070: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
a080: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
a090: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
a0a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
a0b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a0c0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
a0d0: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  e slot */.      
a0e0: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
a0f0: 65 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34  e-4 || pc<addr+4
a100: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
a110: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a120: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
a130: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
a140: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
a150: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ]);.      if( si
a160: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
a170: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a       int x = siz
a180: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
a190: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
a1a0: 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4 );.        tes
a1b0: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
a1c0: 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29         if( x<4 )
a1d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  {.          /* R
a1e0: 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66  emove the slot f
a1f0: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
a200: 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75  t. Update the nu
a210: 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20  mber of.        
a220: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
a230: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
a240: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
a250: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
a260: 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63  [addr], &data[pc
a270: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 2);.         
a280: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28   data[hdr+7] = (
a290: 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a  u8)(nFrag + x);.
a2a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
a2b0: 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62  ( size+pc > usab
a2c0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
a2d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a2e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a2f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a300: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a310: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
a320: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
a330: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
a340: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
a350: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70      ** for the p
a360: 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  ortion used by t
a370: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
a380: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  n. */.          
a390: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
a3a0: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
a3b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64    }.        *pId
a3c0: 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20  x = pc + x;.    
a3d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a3e0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
a3f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
a400: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
a410: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
a420: 20 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61   space in the ga
a430: 70 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a  p to satisfy.  *
a440: 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  * the allocation
a450: 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61  .  If not, defra
a460: 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  gment..  */.  te
a470: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
a480: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
a490: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
a4a0: 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65  p ){.    rc = de
a4b0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
a4c0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
a4d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
a4e0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
a4f0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
a500: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
a510: 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70  ( gap+nByte<=top
a520: 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41   );.  }...  /* A
a530: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
a540: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
a550: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
a560: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
a570: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
a580: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
a590: 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  he btreeInitPage
a5a0: 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65  () call has alre
a5b0: 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74  ady.  ** validat
a5c0: 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ed the freelist.
a5d0: 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65    Given that the
a5e0: 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c   freelist is val
a5f0: 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  id, there.  ** i
a600: 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68  s no way that th
a610: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  e allocation can
a620: 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20   extend off the 
a630: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
a640: 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74  .  ** The assert
a650: 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  () below verifie
a660: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  s the previous s
a670: 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  entence..  */.  
a680: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
a690: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
a6a0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61  dr+5], top);.  a
a6b0: 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65  ssert( top+nByte
a6c0: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
a6d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a6e0: 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70  );.  *pIdx = top
a6f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a700: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
a710: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
a720: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
a730: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
a740: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
a750: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
a760: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
a770: 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61  pPage->aDisk[sta
a780: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
a790: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
a7a0: 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73   is "size" bytes
a7b0: 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20  ..**.** Most of 
a7c0: 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20  the effort here 
a7d0: 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63  is involved in c
a7e0: 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e  oalesing adjacen
a7f0: 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73  t.** free blocks
a800: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62   into a single b
a810: 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a  ig free block..*
a820: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
a830: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
a840: 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74  pPage, int start
a850: 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69  , int size){.  i
a860: 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c  nt addr, pbegin,
a870: 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73   hdr;.  int iLas
a880: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
a890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72            /* Lar
a8a0: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
a8b0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
a8c0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
a8d0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
a8e0: 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72  >aData;..  asser
a8f0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
a900: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a910: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
a920: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
a930: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
a940: 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d  t( start>=pPage-
a950: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61  >hdrOffset+6+pPa
a960: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a970: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
a980: 74 61 72 74 20 2b 20 73 69 7a 65 29 20 3c 3d 20  tart + size) <= 
a990: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
a9a0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
a9b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a9c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a9d0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a9e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
a9f0: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
aa00: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
aa10: 20 34 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61   4 */..  if( pPa
aa20: 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  ge->pBt->btsFlag
aa30: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
aa40: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
aa50: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
aa60: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
aa70: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
aa80: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
aa90: 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73      ** option is
aaa0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20   enabled */.    
aab0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
aac0: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 20  rt], 0, size);. 
aad0: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
aae0: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
aaf0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
ab00: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   of freeblocks. 
ab10: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20   Note that.  ** 
ab20: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
ab30: 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77  freeblock list w
ab40: 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74  as checked by bt
ab50: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20  reeInitPage(),. 
ab60: 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
ab70: 65 28 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65  e() did not dete
ab80: 63 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63  ct overlapping c
ab90: 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65  ells or.  ** fre
aba0: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65  eblocks that ove
abb0: 72 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20  rlapped cells.  
abc0: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74   Nor does it det
abd0: 65 63 74 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ect when the.  *
abe0: 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  * cell content a
abf0: 72 65 61 20 65 78 63 65 65 64 73 20 74 68 65 20  rea exceeds the 
ac00: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67  value in the pag
ac10: 65 20 68 65 61 64 65 72 2e 20 20 49 66 20 74 68  e header.  If th
ac20: 65 73 65 0a 20 20 2a 2a 20 73 69 74 75 61 74 69  ese.  ** situati
ac30: 6f 6e 73 20 61 72 69 73 65 2c 20 74 68 65 6e 20  ons arise, then 
ac40: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 73 65 72  subsequent inser
ac50: 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 67  t operations mig
ac60: 68 74 20 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20  ht corrupt.  ** 
ac70: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 53  the freelist.  S
ac80: 6f 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20  o we do need to 
ac90: 63 68 65 63 6b 20 66 6f 72 20 63 6f 72 72 75 70  check for corrup
aca0: 74 69 6f 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e  tion while scann
acb0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 72 65  ing.  ** the fre
acc0: 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64  elist..  */.  hd
acd0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
ace0: 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68  fset;.  addr = h
acf0: 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20  dr + 1;.  iLast 
ad00: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
ad10: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
ad20: 61 73 73 65 72 74 28 20 73 74 61 72 74 3c 3d 69  assert( start<=i
ad30: 4c 61 73 74 20 29 3b 0a 20 20 77 68 69 6c 65 28  Last );.  while(
ad40: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
ad50: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
ad60: 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69  )<start && pbegi
ad70: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n>0 ){.    if( p
ad80: 62 65 67 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a  begin<addr+4 ){.
ad90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ada0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
adb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
adc0: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20   = pbegin;.  }. 
add0: 20 69 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73   if( pbegin>iLas
ade0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
adf0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ae00: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
ae10: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c  t( pbegin>addr |
ae20: 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20  | pbegin==0 );. 
ae30: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ae40: 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20  addr], start);. 
ae50: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ae60: 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b  start], pbegin);
ae70: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
ae80: 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65  a[start+2], size
ae90: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
aea0: 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  e = pPage->nFree
aeb0: 20 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20   + (u16)size;.. 
aec0: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
aed0: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
aee0: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 68 64  s */.  addr = hd
aef0: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
af00: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
af10: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
af20: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e  >0 ){.    int pn
af30: 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20  ext, psize, x;. 
af40: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
af50: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73  n>addr );.    as
af60: 73 65 72 74 28 20 70 62 65 67 69 6e 20 3c 3d 20  sert( pbegin <= 
af70: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
af80: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
af90: 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74  .    pnext = get
afa0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
afb0: 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20  in]);.    psize 
afc0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
afd0: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
afe0: 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73   if( pbegin + ps
aff0: 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74  ize + 3 >= pnext
b000: 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20   && pnext>0 ){. 
b010: 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20       int frag = 
b020: 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b  pnext - (pbegin+
b030: 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  psize);.      if
b040: 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66  ( (frag<0) || (f
b050: 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68 64  rag>(int)data[hd
b060: 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  r+7]) ){.       
b070: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b080: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b090: 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b     }.      data[
b0a0: 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72  hdr+7] -= (u8)fr
b0b0: 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  ag;.      x = ge
b0c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
b0d0: 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32  xt]);.      put2
b0e0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
b0f0: 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20  n], x);.      x 
b100: 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79  = pnext + get2by
b110: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32  te(&data[pnext+2
b120: 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20  ]) - pbegin;.   
b130: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
b140: 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b  a[pbegin+2], x);
b150: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b160: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
b170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
b180: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
b190: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
b1a0: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
b1b0: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
b1c0: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
b1d0: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
b1e0: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
b1f0: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
b200: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
b210: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
b220: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
b230: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
b240: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
b250: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
b260: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
b270: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20  &data[hdr+5]) + 
b280: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
b290: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70  begin+2]);.    p
b2a0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
b2b0: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a  r+5], top);.  }.
b2c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b2d0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
b2e0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
b2f0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
b300: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b310: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
b320: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
b330: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
b340: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
b350: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
b360: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
b370: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
b380: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
b390: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
b3a0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
b3b0: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
b3c0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
b3d0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
b3e0: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
b3f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
b400: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
b410: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
b420: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
b430: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
b440: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
b450: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
b460: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
b470: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b480: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
b490: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
b4a0: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
b4b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
b4c0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
b4d0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
b4e0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
b4f0: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
b500: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
b510: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
b520: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
b530: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
b540: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b550: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b560: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
b570: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
b580: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
b590: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
b5a0: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
b5b0: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
b5c0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
b5d0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
b5e0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
b5f0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
b600: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
b610: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
b620: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
b630: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
b640: 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  y = 1;.    pPage
b650: 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67  ->hasData = pPag
b660: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61  e->leaf;.    pPa
b670: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b680: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
b690: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
b6a0: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
b6b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
b6c0: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
b6d0: 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ATA ){.    pPage
b6e0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
b6f0: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
b700: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
b710: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
b720: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
b730: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
b740: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
b750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
b760: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
b770: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
b780: 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
b790: 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78  yload = pBt->max
b7a0: 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20  1bytePayload;.  
b7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b7c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
b7d0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
b7e0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
b7f0: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
b800: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
b810: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
b820: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
b830: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
b840: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
b850: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
b860: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
b870: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
b880: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
b890: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
b8a0: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
b8b0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
b8c0: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
b8d0: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
b8e0: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
b8f0: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
b900: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
b910: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
b920: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
b930: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
b940: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
b950: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
b960: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b970: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b980: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b990: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b9a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
b9b0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
b9c0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
b9d0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b9e0: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
b9f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ba00: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ba10: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ba20: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
ba30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
ba40: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
ba50: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
ba60: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
ba70: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
ba80: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
ba90: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
baa0: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
bab0: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
bac0: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
bad0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
bae0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
baf0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
bb00: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
bb10: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
bb20: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
bb30: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
bb40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
bb50: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
bb60: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
bb70: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
bb80: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
bb90: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
bba0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
bbb0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
bbc0: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
bbd0: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
bbe0: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
bbf0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
bc00: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
bc10: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
bc20: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
bc30: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
bc40: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
bc50: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
bc60: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
bc70: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
bc80: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
bc90: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
bca0: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
bcb0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
bcc0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
bcd0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
bce0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
bcf0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
bd00: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
bd10: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
bd20: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
bd30: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
bd40: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
bd50: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
bd60: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
bd70: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
bd80: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bd90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
bda0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
bdb0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
bdc0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
bdd0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
bde0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
bdf0: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
be00: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
be10: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
be20: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
be30: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
be40: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
be50: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
be60: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
be70: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
be80: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
be90: 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
bea0: 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49     pPage->aCellI
beb0: 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dx = &data[cellO
bec0: 66 66 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20  ffset];.    top 
bed0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
bee0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
bef0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
bf00: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
bf10: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
bf20: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
bf30: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
bf40: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
bf50: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
bf60: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
bf70: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
bf80: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
bf90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bfa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
bfb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
bfc0: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
bfd0: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
bfe0: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
bff0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
c000: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
c010: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
c020: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
c030: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
c040: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
c050: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
c060: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
c070: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
c080: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
c090: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
c0a0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
c0b0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
c0c0: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
c0d0: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
c0e0: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
c0f0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
c100: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
c110: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
c120: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
c130: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
c140: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
c150: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
c160: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
c170: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
c180: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
c190: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
c1a0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
c1b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
c1c0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
c1d0: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
c1e0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
c1f0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
c200: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
c210: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
c220: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
c230: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
c240: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
c250: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
c260: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
c270: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c280: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
c290: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
c2a0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
c2b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
c2c0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
c2d0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
c2e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
c2f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c300: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
c310: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
c320: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
c330: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
c340: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c350: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
c360: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
c370: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
c380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
c390: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c3a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
c3b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c3c0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
c3d0: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
c3e0: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
c3f0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
c400: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
c410: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
c420: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
c430: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c440: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
c450: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
c460: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
c470: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
c480: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
c490: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
c4a0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
c4b0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
c4c0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
c4d0: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
c4e0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
c4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c500: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
c520: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
c530: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
c540: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
c550: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
c560: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
c570: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
c580: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
c590: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c5a0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
c5b0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
c5c0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
c5d0: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
c5e0: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
c5f0: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
c600: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
c610: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
c620: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
c630: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c640: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
c650: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
c660: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
c670: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
c680: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
c690: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
c6a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
c6b0: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
c6c0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
c6d0: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
c6e0: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
c6f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
c700: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
c710: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
c720: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
c730: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
c740: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
c750: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
c760: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
c770: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
c780: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
c790: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
c7a0: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
c7b0: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
c7c0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
c7d0: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
c7e0: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
c7f0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
c800: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
c810: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
c820: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
c830: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
c840: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
c850: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c860: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
c870: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
c880: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
c890: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
c8a0: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
c8b0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
c8c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c8d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
c8e0: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
c8f0: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
c900: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
c910: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
c920: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
c930: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
c940: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
c950: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
c960: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
c970: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
c980: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
c990: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
c9a0: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
c9b0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
c9c0: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
c9d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
c9e0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
c9f0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
ca00: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
ca10: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
ca20: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
ca30: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
ca40: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
ca50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
ca60: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
ca70: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
ca80: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
ca90: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
caa0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
cab0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
cac0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
cad0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
cae0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
caf0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
cb00: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
cb10: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
cb20: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
cb30: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
cb40: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
cb50: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
cb60: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
cb70: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
cb80: 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
cb90: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
cba0: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
cbb0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
cbc0: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
cbd0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
cbe0: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
cbf0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
cc00: 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
cc10: 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
cc20: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
cc30: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
cc40: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
cc50: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
cc60: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
cc70: 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
cc80: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
cc90: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
cca0: 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
ccb0: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
ccc0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
ccd0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
cce0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
ccf0: 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
cd00: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
cd10: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
cd20: 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
cd30: 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
cd40: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
cd50: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
cd60: 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
cd70: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
cd80: 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
cd90: 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
cda0: 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
cdb0: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
cdc0: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
cdd0: 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
cde0: 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
cdf0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
ce00: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
ce10: 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
ce20: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
ce30: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
ce40: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
ce50: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
ce60: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
ce70: 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
ce80: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
ce90: 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
cea0: 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
ceb0: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
cec0: 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  et = pPage->pgno
ced0: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
cee0: 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
cef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
cf00: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
cf10: 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
cf20: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
cf30: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
cf40: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
cf50: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   needed..**.** I
cf60: 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  f the noContent 
cf70: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
cf80: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
cf90: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
cfa0: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
cfb0: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
cfc0: 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
cfd0: 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
cfe0: 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
cff0: 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
d000: 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
d010: 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
d020: 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
d030: 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
d040: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
d050: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
d060: 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
d070: 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
d080: 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
d090: 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
d0a0: 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
d0b0: 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
d0c0: 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
d0d0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
d0e0: 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
d0f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
d100: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
d110: 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
d120: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
d130: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
d140: 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
d150: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
d160: 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
d170: 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
d180: 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
d190: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
d1a0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
d1b0: 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
d1c0: 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
d1d0: 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
d1e0: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
d1f0: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
d200: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
d210: 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
d220: 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
d230: 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
d240: 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
d250: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d260: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d270: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
d280: 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
d290: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
d2a0: 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
d2b0: 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  bPage, flags);. 
d2c0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d2d0: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
d2e0: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
d2f0: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
d300: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
d310: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d320: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
d330: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
d340: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
d350: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
d360: 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72  ge is not.** alr
d370: 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65  eady in the page
d380: 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e  r cache return N
d390: 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20  ULL. Initialize 
d3a0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
d3b0: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
d3c0: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
d3d0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
d3e0: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
d3f0: 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68  ePageLookup(BtSh
d400: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
d410: 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  pgno){.  DbPage 
d420: 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
d430: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d440: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
d450: 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20  x) );.  pDbPage 
d460: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
d470: 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
d480: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
d490: 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  DbPage ){.    re
d4a0: 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72  turn btreePageFr
d4b0: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
d4c0: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
d4d0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
d4e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
d4f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
d500: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
d510: 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  ages. If there i
d520: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a  s any kind of.**
d530: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28   error, return (
d540: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31  (unsigned int)-1
d550: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  )..*/.static Pgn
d560: 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o btreePagecount
d570: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
d580: 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e  .  return pBt->n
d590: 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  Page;.}.u32 sqli
d5a0: 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65  te3BtreeLastPage
d5b0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
d5c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
d5d0: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
d5e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70  );.  assert( ((p
d5f0: 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78  ->pBt->nPage)&0x
d600: 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20  8000000)==0 );. 
d610: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
d620: 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
d630: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
d640: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
d650: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
d660: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
d670: 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a  ine is just a.**
d680: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
d690: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
d6a0: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74  rate calls to bt
d6b0: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
d6c0: 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61   .** btreeInitPa
d6d0: 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ge()..**.** If a
d6e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
d6f0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a  then the value *
d700: 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
d710: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
d720: 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
d730: 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
d740: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
d750: 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
d760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
d770: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
d780: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
d7b0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
d7c0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
d7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d7e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
d7f0: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
d800: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d820: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
d830: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
d840: 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20   int bReadonly  
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45   /* PAGER_GET_RE
d870: 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29  ADONLY or 0 */.)
d880: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
d890: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d8a0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d8b0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
d8c0: 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47  ( bReadonly==PAG
d8d0: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
d8e0: 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  || bReadonly==0 
d8f0: 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62  );..  if( pgno>b
d900: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
d910: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  t) ){.    rc = S
d920: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d930: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
d940: 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
d950: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
d960: 50 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29  Page, bReadonly)
d970: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
d980: 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50  LITE_OK && (*ppP
d990: 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
d9a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ){.      rc = bt
d9b0: 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
d9c0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
d9d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d9e0: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
d9f0: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
da00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
da10: 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  ..  testcase( pg
da20: 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
da30: 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
da40: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
da50: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
da60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
da70: 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
da80: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
da90: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
daa0: 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
dab0: 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
dac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dad0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
dae0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
daf0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
db00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
db10: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
db20: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
db30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
db40: 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
db50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
db60: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
db70: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
db80: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
db90: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
dba0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
dbb0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
dbc0: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
dbd0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
dbe0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
dbf0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
dc00: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
dc10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
dc20: 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
dc30: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
dc40: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
dc50: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
dc60: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
dc70: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
dc80: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
dc90: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
dca0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
dcb0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
dcc0: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
dcd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
dce0: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
dcf0: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
dd00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
dd10: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
dd20: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
dd30: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
dd40: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
dd50: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
dd60: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
dd70: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
dd80: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
dd90: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
dda0: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
ddb0: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
ddc0: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
ddd0: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
dde0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
ddf0: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
de00: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
de10: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
de20: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
de30: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
de40: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
de50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
de60: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
de70: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
de80: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
de90: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
dea0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
deb0: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
dec0: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
ded0: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
dee0: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
def0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
df00: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
df10: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
df20: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
df30: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
df40: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
df50: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
df60: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
df70: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
df80: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
df90: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
dfa0: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
dfb0: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
dfc0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
dfd0: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
dfe0: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
dff0: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
e000: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
e010: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
e020: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
e030: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
e040: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
e050: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
e060: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
e070: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
e080: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
e090: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
e0a0: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
e0b0: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
e0c0: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
e0d0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
e0e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
e0f0: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
e100: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
e110: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e120: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e130: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
e140: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
e150: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
e160: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
e170: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
e180: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
e190: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
e1a0: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
e1b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
e1c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
e1d0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
e1e0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
e1f0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
e200: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
e210: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
e220: 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
e230: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
e240: 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
e250: 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
e260: 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
e270: 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
e280: 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
e290: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
e2a0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
e2b0: 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
e2c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
e2d0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
e2e0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
e2f0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
e300: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
e310: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
e320: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
e330: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
e340: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
e350: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
e360: 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
e370: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
e380: 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
e390: 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
e3a0: 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
e3b0: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
e3c0: 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
e3d0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
e3e0: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
e3f0: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
e400: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e410: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
e420: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
e430: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
e440: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
e450: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
e460: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
e470: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
e480: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
e490: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
e4a0: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
e4b0: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
e4c0: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
e4d0: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
e4e0: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
e4f0: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
e500: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e510: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
e520: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
e530: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
e540: 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
e550: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e560: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
e570: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
e580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
e590: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
e5a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
e5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
e5c0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
e5d0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
e5e0: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
e5f0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
e600: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
e610: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
e620: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e640: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
e650: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
e660: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
e670: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
e680: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
e690: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
e6a0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e6c0: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
e6d0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e6e0: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
e710: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
e720: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
e730: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
e740: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
e750: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
e760: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
e770: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e780: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
e790: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
e7a0: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
e7b0: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e7d0: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
e7e0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
e7f0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
e800: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
e810: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
e820: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
e830: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
e840: 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
e850: 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
e860: 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
e870: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
e880: 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
e890: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
e8a0: 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
e8b0: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
e8c0: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
e8d0: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
e8e0: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
e8f0: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
e900: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
e910: 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
e920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e930: 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
e940: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
e950: 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
e960: 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
e970: 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
e980: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
e990: 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
e9c0: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
e9d0: 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
ea00: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
ea10: 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
ea20: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
ea30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
ea40: 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
ea50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ea60: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
ea70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
ea80: 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
ea90: 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
eaa0: 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
eab0: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
eac0: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
ead0: 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
eae0: 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
eaf0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
eb00: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
eb10: 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
eb20: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
eb30: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
eb40: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
eb50: 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
eb60: 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
eb70: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
eb80: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
eb90: 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
eba0: 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
ebb0: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
ebc0: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
ebd0: 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
ebe0: 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
ebf0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
ec00: 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
ec10: 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
ec20: 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
ec30: 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
ec40: 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
ec50: 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
ec60: 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
ec70: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
ec80: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
ec90: 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
eca0: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
ecb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ecc0: 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
ecd0: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
ece0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
ecf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ed00: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
ed10: 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
ed20: 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
ed30: 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
ed40: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ed50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ed60: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
ed70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ed80: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
ed90: 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
eda0: 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
edb0: 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
edc0: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
edd0: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
ede0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
edf0: 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
ee00: 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
ee10: 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
ee20: 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
ee30: 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
ee40: 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
ee50: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
ee60: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
ee70: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
ee80: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
ee90: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
eea0: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
eeb0: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
eec0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
eed0: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
eee0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
eef0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
ef00: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
ef10: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
ef20: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
ef30: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
ef40: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
ef50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ef60: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ef70: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ef80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ef90: 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
efa0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
efb0: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
efc0: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  name, sqlite3Str
efd0: 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
efe0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
eff0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
f000: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
f010: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
f020: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61           nFullPa
f050: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
f060: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
f070: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f080: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f090: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
f0a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f0b0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
f0c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f0d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f0e0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
f0f0: 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d  READSAFE.      m
f100: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
f110: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
f120: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
f130: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
f140: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f150: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
f160: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
f170: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f180: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f190: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
f1a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
f1b0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
f1c0: 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a  Shared);.#endif.
f1d0: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
f1e0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f1f0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f200: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
f210: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
f220: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
f230: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
f240: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
f250: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
f260: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
f270: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
f280: 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  er, 0)).        
f290: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
f2a0: 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
f2b0: 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
f2c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
f2d0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
f2e0: 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
f2f0: 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
f300: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
f310: 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
f320: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
f330: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
f340: 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
f350: 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
f360: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
f370: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f380: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
f390: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
f3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f3b0: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
f3c0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
f3d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f3e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f400: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
f420: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
f430: 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
f440: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f450: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
f460: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
f470: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
f480: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f490: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f4a0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f4b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f4c0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f4d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
f4e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f4f0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
f500: 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
f510: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
f520: 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
f530: 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
f540: 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
f550: 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
f560: 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
f570: 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
f580: 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
f590: 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
f5a0: 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
f5b0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
f5c0: 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
f5d0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
f5e0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
f5f0: 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
f600: 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
f610: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
f620: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
f630: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
f640: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
f650: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
f660: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f670: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
f680: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
f690: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
f6a0: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
f6b0: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
f6c0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
f6d0: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
f6e0: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
f6f0: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
f700: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
f710: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
f720: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
f730: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f740: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
f750: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
f760: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f770: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
f780: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
f790: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f7a0: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
f7b0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
f7c0: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
f7d0: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
f7e0: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
f7f0: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
f800: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
f810: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
f820: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
f830: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
f840: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
f850: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f860: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
f870: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
f880: 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
f890: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
f8c0: 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
f8d0: 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
f8e0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f8f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f900: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
f910: 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
f920: 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
f930: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f940: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
f950: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
f960: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
f970: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
f980: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f990: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f9a0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
f9b0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f9c0: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
f9d0: 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
f9e0: 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
f9f0: 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
fa00: 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
fa10: 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
fa20: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
fa30: 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
fa40: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
fa50: 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
fa60: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
fa70: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
fa80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
fa90: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
faa0: 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
fab0: 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
fac0: 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
fad0: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
fae0: 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
faf0: 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
fb00: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
fb10: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d  .#endif.    pBt-
fb20: 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
fb30: 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
fb40: 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
fb50: 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
fb60: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
fb70: 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
fb80: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
fb90: 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
fba0: 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
fbb0: 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
fbc0: 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
fbd0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
fbe0: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
fbf0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
fc00: 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
fc10: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
fc20: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
fc30: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
fc40: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
fc50: 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
fc60: 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
fc70: 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
fc80: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
fc90: 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
fca0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
fcb0: 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
fcc0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
fcd0: 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
fce0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
fcf0: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
fd00: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
fd10: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
fd20: 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
fd30: 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
fd40: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
fd50: 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
fd60: 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
fd70: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fd80: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
fd90: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
fda0: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
fdb0: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
fdc0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
fdd0: 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
fde0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
fdf0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
fe00: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
fe10: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
fe20: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
fe30: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
fe40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fe50: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
fe60: 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
fe70: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
fe80: 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
fe90: 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
fea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
feb0: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
fec0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
fed0: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
fee0: 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
fef0: 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
ff00: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
ff10: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
ff20: 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
ff30: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
ff40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ff50: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
ff60: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
ff70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
ff80: 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
ff90: 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
ffa0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
ffb0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
ffc0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
ffd0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
ffe0: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
fff0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
10000 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
10010 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
10020 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
10030 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10040 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
10050 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
10060 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
10070 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
10080 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
10090 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
100a0 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
100b0 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
100c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
100d0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
100e0 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
100f0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
10100 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70  hared; ).      p
10110 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
10120 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
10130 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
10140 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
10150 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
10160 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
10170 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
10180 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
10190 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
101a0 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
101b0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
101c0 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
101d0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
101e0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
101f0 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
10200 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
10210 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
10220 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  MEM;.          d
10230 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10240 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 0;.          g
10250 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
10260 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
10270 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
10280 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10290 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
102a0 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
102b0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
102c0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
102d0 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
102e0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
102f0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
10300 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
10310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10320 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
10330 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
10340 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
10350 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10360 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
10370 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
10380 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
10390 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
103a0 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
103b0 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
103c0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
103d0 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
103e0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
103f0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
10400 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
10410 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
10420 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
10430 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
10440 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
10450 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
10460 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
10470 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10480 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
10490 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
104a0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
104b0 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
104c0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
104d0 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
104e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
104f0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
10500 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
10510 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
10520 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
10530 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
10540 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
10550 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
10560 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
10570 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
10580 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
10590 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
105a0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
105b0 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
105c0 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
105d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
105e0 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
105f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10600 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
10610 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
10620 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
10630 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
10640 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
10650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10660 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
10670 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
10680 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
10690 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
106a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
106b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
106c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
106d0 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
106e0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
106f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10700 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
10710 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
10720 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10730 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10740 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
10750 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10760 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
10770 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
10780 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
10790 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
107a0 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
107b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
107c0 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
107d0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
107e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
107f0 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
10800 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
10810 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
10820 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
10830 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
10840 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
10850 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
10860 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
10870 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
10880 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
10890 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
108a0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
108b0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
108c0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
108d0 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
108e0 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
108f0 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
10900 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10910 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
10920 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
10930 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
10940 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
10950 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10960 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
10970 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
10980 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
10990 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
109a0 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
109b0 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
109c0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
109d0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
109e0 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
109f0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
10a00 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
10a10 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
10a20 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
10a30 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
10a40 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
10a50 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
10a60 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
10a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10a80 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10a90 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
10aa0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
10ab0 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
10ac0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
10ad0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
10ae0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10af0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
10b00 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
10b10 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
10b20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
10b30 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10b40 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
10b50 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
10b60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10b70 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
10b80 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
10b90 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
10ba0 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
10bb0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
10bc0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
10bd0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
10be0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10bf0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10c00 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
10c10 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
10c20 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
10c30 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10c40 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10c50 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
10c60 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
10c70 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
10c80 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
10c90 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
10ca0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
10cb0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
10cc0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
10cd0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
10ce0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
10cf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10d00 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
10d10 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
10d20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
10d30 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
10d40 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
10d50 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
10d60 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10d70 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
10d80 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
10d90 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
10da0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
10db0 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
10dc0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
10dd0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
10de0 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
10df0 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a  ZE(pBt) bytes..*
10e00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
10e10 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
10e20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10e30 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
10e40 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
10e50 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
10e60 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
10e70 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
10e80 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
10e90 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
10ea0 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
10eb0 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
10ec0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
10ed0 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
10ee0 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
10ef0 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
10f00 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
10f10 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
10f20 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
10f30 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
10f40 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
10f50 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
10f60 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
10f70 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
10f80 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
10f90 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
10fa0 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
10fb0 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
10fc0 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
10fd0 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
10fe0 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
10ff0 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
11000 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
11010 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
11020 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
11030 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
11040 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
11050 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
11060 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
11070 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
11080 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
11090 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
110a0 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
110b0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
110c0 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
110d0 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
110e0 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
110f0 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
11100 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
11110 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
11120 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  here.  */.    if
11130 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
11140 20 29 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70   ) memset(pBt->p
11150 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 34 29 3b  TmpSpace, 0, 4);
11160 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
11170 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
11180 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
11190 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
111a0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
111b0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
111c0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
111d0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
111e0 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
111f0 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
11200 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
11210 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
11220 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
11230 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
11240 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
11250 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
11260 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11270 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
11280 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
11290 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
112a0 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
112b0 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
112c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
112d0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
112e0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
112f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11300 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
11310 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
11320 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
11330 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
11340 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
11350 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
11360 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
11370 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11380 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
11390 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
113a0 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
113b0 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
113c0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
113d0 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
113e0 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
113f0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
11400 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
11410 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
11420 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
11430 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
11440 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
11450 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
11460 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
11470 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11480 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
11490 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
114a0 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
114b0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
114c0 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
114d0 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
114e0 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
114f0 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
11500 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
11510 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
11520 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
11530 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
11540 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
11550 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
11560 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
11570 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
11580 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
11590 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
115a0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
115b0 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
115c0 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
115d0 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
115e0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
115f0 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
11600 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
11610 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
11620 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
11630 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
11640 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
11650 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
11660 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
11670 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
11680 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
11690 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
116a0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
116b0 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
116c0 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
116d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
116e0 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74  te3DbFree(0, pBt
116f0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
11700 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
11710 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
11720 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
11730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11740 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
11750 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
11760 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
11770 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
11780 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
11790 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
117a0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
117b0 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
117c0 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
117d0 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
117e0 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
117f0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
11800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
11820 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
11830 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
11840 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
11850 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
11860 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
11870 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
11880 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
11890 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
118a0 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
118b0 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
118c0 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
118d0 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
118e0 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
118f0 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
11900 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
11910 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
11920 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
11930 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
11940 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
11950 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
11960 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
11970 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
11980 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
11990 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
119a0 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
119b0 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
119c0 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
119d0 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
119e0 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
119f0 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
11a00 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
11a10 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
11a20 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
11a30 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
11a40 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
11a50 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
11a60 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
11a70 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
11a80 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
11a90 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
11aa0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
11ab0 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
11ac0 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
11ad0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
11ae0 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
11af0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
11b00 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11b10 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
11b20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11b30 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
11b40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
11b50 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11b60 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
11b70 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
11b80 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
11b90 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
11ba0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11bc0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
11bd0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
11be0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
11bf0 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75  imit on the amou
11c00 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nt of the databa
11c10 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79  se file that may
11c20 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61   be.** memory ma
11c30 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pped..*/.int sql
11c40 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70  ite3BtreeSetMmap
11c50 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20  Limit(Btree *p, 
11c60 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
11c70 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65  Mmap){.  BtShare
11c80 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11c90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11ca0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
11cb0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
11cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11cd0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
11ce0 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
11cf0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73  t(pBt->pPager, s
11d00 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  zMmap);.  sqlite
11d10 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11d30 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
11d40 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
11d50 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
11d60 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
11d70 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
11d80 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
11d90 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
11da0 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
11db0 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
11dc0 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
11dd0 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
11de0 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
11df0 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
11e00 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
11e10 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
11e20 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
11e30 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
11e40 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
11e50 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
11e60 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
11e70 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
11e80 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
11e90 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
11ea0 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
11eb0 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
11ec0 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
11ed0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
11ee0 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
11ef0 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
11f00 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
11f10 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
11f20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
11f30 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
11f40 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
11f50 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65  gerFlags(.  Btre
11f60 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
11f70 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11f80 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74  to set the safet
11f90 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20  y level on */.  
11fa0 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
11fb0 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
11fc0 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20  s PAGER_* flags 
11fd0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
11fe0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11ff0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12000 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
12010 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
12020 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12030 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
12040 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
12050 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67  ->pPager, pgFlag
12060 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
12070 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12090 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
120a0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
120b0 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
120c0 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
120d0 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
120e0 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
120f0 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
12100 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
12110 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
12120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12130 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
12140 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
12150 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
12160 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
12170 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12180 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
12190 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
121a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
121b0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
121c0 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
121d0 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
121e0 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
121f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
12200 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12210 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12220 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
12230 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
12240 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
12250 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
12260 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
12270 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
12280 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
12290 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
122a0 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
122b0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
122c0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
122d0 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
122e0 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
122f0 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
12300 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
12310 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
12320 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
12330 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
12340 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
12350 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
12360 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
12370 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
12380 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
12390 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
123a0 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
123b0 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
123c0 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
123d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
123e0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
123f0 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
12400 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
12410 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
12420 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
12430 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
12440 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
12450 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
12460 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
12470 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
12480 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
12490 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
124a0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
124b0 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
124c0 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
124d0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
124e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
124f0 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
12500 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
12510 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
12520 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
12530 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
12540 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
12550 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
12560 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
12570 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
12580 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
12590 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
125a0 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
125b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
125c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
125d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
125e0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
125f0 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
12600 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
12610 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12620 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
12630 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
12640 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
12650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
12660 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
12670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
12680 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
12690 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
126a0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
126b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
126c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
126d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
126e0 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
126f0 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
12700 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
12710 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
12720 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
12730 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
12740 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
12750 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
12760 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
12770 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
12780 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
12790 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
127a0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
127b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
127c0 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
127d0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
127e0 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
127f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
12800 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
12810 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
12820 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
12830 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
12840 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
12850 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
12860 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
12870 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
12880 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
12890 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
128a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
128b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
128c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
128d0 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
128e0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
128f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
12900 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
12910 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
12920 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
12930 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
12940 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
12950 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
12960 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
12970 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12980 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
12990 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
129a0 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
129b0 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
129c0 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
129d0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
129e0 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
129f0 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
12a00 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
12a10 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
12a20 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
12a30 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
12a40 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
12a50 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
12a60 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
12a70 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
12a80 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
12a90 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
12aa0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
12ab0 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
12ac0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
12ad0 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
12ae0 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
12af0 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
12b00 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
12b10 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
12b20 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
12b30 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12b40 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
12b50 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
12b60 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
12b70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
12b80 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
12b90 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
12ba0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12bb0 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
12bc0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12bd0 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
12be0 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
12bf0 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  ableSize;.}.#end
12c00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53  if /* SQLITE_HAS
12c10 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45  _CODEC || SQLITE
12c20 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21  _DEBUG */..#if !
12c30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12c40 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
12c50 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
12c60 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
12c70 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  M)./*.** Return 
12c80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
12c90 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
12ca0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
12cb0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
12cc0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
12cd0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
12ce0 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
12cf0 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
12d00 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
12d10 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
12d20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12d30 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
12d40 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
12d50 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
12d60 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
12d70 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
12d80 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
12d90 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
12da0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12db0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
12dc0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
12dd0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
12de0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
12df0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
12e00 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
12e10 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
12e20 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
12e30 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
12e40 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
12e50 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
12e60 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
12e70 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
12e80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12e90 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
12ea0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
12eb0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
12ec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12ed0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
12ee0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
12ef0 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
12f00 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
12f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12f20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12f30 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
12f40 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
12f50 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65  ELETE flag if ne
12f60 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e  wFlag is 0 or 1.
12f70 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20    If newFlag is 
12f80 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  -1,.** then make
12f90 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c   no changes.  Al
12fa0 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
12fb0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53  value of the BTS
12fc0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a  _SECURE_DELETE.*
12fd0 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20  * setting after 
12fe0 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69  the change..*/.i
12ff0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
13000 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65  ecureDelete(Btre
13010 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61  e *p, int newFla
13020 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69  g){.  int b;.  i
13030 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
13040 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
13050 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
13060 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a  ( newFlag>=0 ){.
13070 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46      p->pBt->btsF
13080 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43  lags &= ~BTS_SEC
13090 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  URE_DELETE;.    
130a0 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d  if( newFlag ) p-
130b0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c  >pBt->btsFlags |
130c0 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
130d0 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20  ETE;.  } .  b = 
130e0 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  (p->pBt->btsFlag
130f0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
13100 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c  ELETE)!=0;.  sql
13110 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13120 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
13130 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
13140 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13150 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
13160 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
13170 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
13180 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
13190 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
131a0 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
131b0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
131c0 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
131d0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
131e0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
131f0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
13200 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
13210 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
13220 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
13230 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
13240 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
13250 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
13260 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
13270 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13280 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
13290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
132a0 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
132b0 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
132c0 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
132d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
132e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
132f0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
13300 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
13310 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
13320 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
13330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
13340 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
13350 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
13360 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13370 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
13380 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
13390 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
133a0 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
133b0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
133c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
133d0 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
133e0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
133f0 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
13400 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13410 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
13420 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
13430 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13440 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
13450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13460 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
13470 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
13480 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
13490 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
134a0 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
134b0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
134c0 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
134d0 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
134e0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
134f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
13500 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
13510 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
13520 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
13530 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
13540 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13550 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
13560 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
13570 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
13580 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
13590 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
135a0 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
135b0 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
135c0 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
135d0 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
135e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
135f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13600 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
13610 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
13620 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
13630 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
13640 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
13650 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
13660 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
13670 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
13680 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13690 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
136a0 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
136b0 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
136c0 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
136d0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
136e0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
136f0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
13700 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
13710 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
13720 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
13730 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
13740 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
13750 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
13760 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
13770 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
13780 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
13790 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
137a0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
137b0 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
137c0 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
137d0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
137e0 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
137f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
13800 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
13810 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13820 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
13830 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
13840 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
13850 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
13860 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
13870 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
13880 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
13890 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
138a0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
138b0 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
138c0 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
138d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
138e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
138f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
13900 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
13910 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
13920 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
13930 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
13940 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13950 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
13960 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
13970 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
13980 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
13990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
139a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
139b0 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
139c0 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
139d0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
139e0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
139f0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
13a00 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
13a10 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
13a20 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
13a30 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
13a40 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
13a50 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
13a60 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
13a70 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
13a80 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
13a90 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
13aa0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
13ab0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
13ac0 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
13ad0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
13ae0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
13af0 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
13b00 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
13b10 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
13b20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
13b30 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
13b40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
13b50 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
13b60 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
13b70 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
13b80 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13b90 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13ba0 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
13bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
13bc0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
13bd0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
13be0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
13bf0 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
13c00 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
13c10 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
13c20 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
13c30 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c  ailed;.    }.#el
13c40 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  se.    if( page1
13c50 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [18]>2 ){.      
13c60 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13c70 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
13c80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
13c90 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20  ge1[19]>2 ){.   
13ca0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13cb0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13cc0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
13cd0 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73  write version is
13ce0 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20   set to 2, this 
13cf0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
13d00 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20  be accessed.    
13d10 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
13d20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f  If the log is no
13d30 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
13d40 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65  open it now. The
13d50 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  n .    ** return
13d60 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
13d70 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f  eturn without po
13d80 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65  pulating BtShare
13d90 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a  d.pPage1..    **
13da0 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65   The caller dete
13db0 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c  cts this and cal
13dc0 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
13dd0 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a   again. This is.
13de0 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20      ** required 
13df0 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f  as the version o
13e00 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74  f page 1 current
13e10 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20  ly in the page1 
13e20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61  buffer.    ** ma
13e30 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74  y not be the lat
13e40 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68  est version - th
13e50 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77  ere may be a new
13e60 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f  er one in the lo
13e70 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20  g.    ** file.. 
13e80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61     */.    if( pa
13e90 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70  ge1[19]==2 && (p
13ea0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
13eb0 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b  TS_NO_WAL)==0 ){
13ec0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65  .      int isOpe
13ed0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  n = 0;.      rc 
13ee0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
13ef0 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  enWal(pBt->pPage
13f00 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20  r, &isOpen);.   
13f10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13f20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13f30 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
13f40 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65  failed;.      }e
13f50 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d  lse if( isOpen==
13f60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
13f70 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
13f80 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13fa0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53    }.      rc = S
13fb0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
13fc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
13fd0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
13fe0 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
13ff0 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
14000 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
14010 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
14020 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
14030 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
14040 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
14050 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
14060 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
14070 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
14080 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
14090 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
140a0 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
140b0 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
140c0 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
140d0 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
140e0 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
140f0 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
14100 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
14110 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
14120 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
14130 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
14140 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31  eSize = (page1[1
14150 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b  6]<<8) | (page1[
14160 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
14170 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
14180 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
14190 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
141a0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
141b0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
141c0 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
141d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
141e0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
141f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
14200 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
14210 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
14220 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
14230 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
14240 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
14250 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
14260 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
14270 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
14280 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
14290 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
142a0 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
142b0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
142c0 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
142d0 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
142e0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
142f0 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
14300 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
14310 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
14320 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
14330 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
14340 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
14350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14360 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
14370 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
14380 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
14390 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
143a0 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
143b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
143c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
143d0 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
143e0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
143f0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
14400 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
14410 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
14420 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
14430 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14440 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
14450 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
14460 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
14470 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
144a0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
144b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
144c0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d   }.    if( (pBt-
144d0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
144e0 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65  ITE_RecoveryMode
144f0 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50  )==0 && nPage>nP
14500 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
14510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
14520 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
14530 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
14540 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
14550 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
14560 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
14570 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
14580 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
14590 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
145a0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
145b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
145c0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
145d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
145e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
145f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
14600 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
14610 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
14620 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
14630 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
14640 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
14650 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
14660 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
14670 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
14680 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
14690 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
146a0 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
146b0 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
146c0 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
146d0 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
146e0 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
146f0 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
14700 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
14710 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
14720 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
14730 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
14740 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
14750 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
14760 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
14770 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
14780 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
14790 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
147a0 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
147b0 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
147c0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
147d0 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
147e0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
147f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
14800 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
14810 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
14820 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
14830 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
14840 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
14850 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
14860 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
14870 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
14880 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
14890 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
148a0 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
148b0 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
148c0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
148d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
148e0 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
148f0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
14900 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
14910 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
14920 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
14930 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
14940 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
14950 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
14960 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
14970 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
14980 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
14990 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  3);.  if( pBt->m
149a0 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20  axLocal>127 ){. 
149b0 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
149c0 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20  Payload = 127;. 
149d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
149e0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
149f0 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c   = (u8)pBt->maxL
14a00 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ocal;.  }.  asse
14a10 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
14a20 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
14a30 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
14a40 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
14a50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61  age1;.  pBt->nPa
14a60 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
14a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14a80 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
14a90 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
14aa0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
14ab0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
14ac0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
14ad0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
14ae0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
14af0 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
14b00 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69  open on pBt. Thi
14b10 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
14b20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
14b30 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
14b40 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
14b50 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
14b60 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
14b70 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
14b80 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
14b90 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74  d if wrOnly is t
14ba0 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20  rue.  If wrOnly 
14bb0 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e  is.** false then
14bc0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
14bd0 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   counted..**.** 
14be0 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
14bf0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
14c00 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e  , a cursor is an
14c10 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
14c20 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72   is capable of r
14c30 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
14c40 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
14c50 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a  .  Cursors that.
14c60 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69  ** have been tri
14c70 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55  pped into the CU
14c80 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65  RSOR_FAULT state
14c90 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64   are not counted
14ca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14cb0 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
14cc0 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
14cd0 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20   int wrOnly){.  
14ce0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
14cf0 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
14d00 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
14d10 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
14d20 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
14d30 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d     if( (wrOnly==
14d40 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46  0 || (pCur->curF
14d50 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
14d60 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20  eFlag)!=0).     
14d70 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
14d80 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
14d90 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
14da0 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
14db0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
14dc0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
14dd0 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
14de0 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
14df0 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
14e00 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
14e10 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
14e20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
14e30 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
14e40 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
14e50 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
14e60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14e70 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
14e80 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
14e90 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
14ea0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
14eb0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
14ec0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
14ed0 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
14ee0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
14ef0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
14f00 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
14f10 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
14f20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
14f30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14f40 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14f50 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
14f60 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30  lidCursors(pBt,0
14f70 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  )==0 || pBt->inT
14f80 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
14f90 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
14fa0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14fb0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
14fc0 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
14fd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14fe0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
14ff0 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
15000 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
15010 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
15020 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  r)==1 );.    ass
15030 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
15040 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72  ->aData );.    r
15050 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
15060 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74  pPage1);.    pBt
15070 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
15080 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
15090 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
150a0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
150b0 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
150c0 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
150d0 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
150e0 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
150f0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
15100 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
15110 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
15120 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
15130 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
15140 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
15150 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
15160 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
15170 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
15180 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15190 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
151a0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
151b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
151c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
151d0 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
151e0 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
151f0 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
15200 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
15210 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15220 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
15230 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
15240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
15250 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
15260 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
15270 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
15280 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
15290 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
152a0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
152b0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
152c0 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
152d0 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
152e0 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
152f0 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
15300 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
15310 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
15320 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
15330 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
15340 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
15350 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
15360 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
15370 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
15380 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
15390 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
153a0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
153b0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
153c0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
153d0 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
153e0 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
153f0 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
15400 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
15410 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
15420 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
15430 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
15440 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
15450 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15460 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
15470 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
15480 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
15490 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
154a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
154b0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
154c0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
154d0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
154e0 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
154f0 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
15500 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
15510 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
15520 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
15530 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
15540 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
15550 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
15560 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15570 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
15580 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
15590 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
155a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
155b0 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
155c0 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
155d0 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
155e0 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
155f0 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
15600 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
15610 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
15620 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
15630 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
15640 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15650 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
15660 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
15670 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15680 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
15690 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
156a0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
156b0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
156c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
156d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
156e0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
156f0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
15700 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
15710 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
15720 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
15730 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15740 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
15750 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
15760 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
15770 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
15780 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
15790 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
157a0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
157b0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
157c0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
157d0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
157e0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
157f0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
15800 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
15810 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
15820 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
15830 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
15840 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
15850 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
15860 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
15870 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
15880 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
15890 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
158a0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
158b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
158c0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
158d0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
158e0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
158f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
15900 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
15910 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
15920 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
15930 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
15940 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
15950 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
15960 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
15970 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
15980 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
15990 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
159a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
159b0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
159c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
159d0 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
159e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
159f0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
15a00 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
15a10 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
15a20 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
15a30 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
15a40 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
15a50 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
15a60 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
15a70 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
15a80 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
15a90 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
15aa0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
15ab0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
15ac0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
15ad0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
15ae0 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
15af0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
15b00 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
15b10 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
15b20 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
15b30 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
15b40 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
15b50 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
15b60 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
15b70 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
15b80 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
15b90 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
15ba0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
15bb0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
15bc0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
15bd0 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
15be0 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
15bf0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
15c00 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
15c10 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
15c20 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
15c30 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
15c40 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
15c50 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
15c60 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
15c70 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
15c80 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
15c90 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
15ca0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
15cb0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
15cc0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
15cd0 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
15ce0 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
15cf0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
15d00 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
15d10 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
15d20 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
15d30 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
15d40 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
15d50 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
15d60 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
15d70 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15d80 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
15d90 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
15da0 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
15db0 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
15dc0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15dd0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
15de0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
15df0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15e00 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
15e10 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
15e20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
15e30 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
15e40 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
15e50 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
15e60 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
15e70 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
15e80 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
15e90 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
15ea0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
15eb0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
15ec0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
15ed0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
15ee0 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
15ef0 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
15f00 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
15f10 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
15f20 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
15f30 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
15f40 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
15f50 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
15f60 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
15f70 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  ;..  /* Write tr
15f80 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
15f90 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
15fa0 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
15fb0 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ase */.  if( (pB
15fc0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
15fd0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
15fe0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
15ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
16000 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
16010 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
16020 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16030 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16040 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
16050 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
16060 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
16070 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
16080 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
16090 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
160a0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
160b0 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
160c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
160d0 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
160e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
160f0 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
16100 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
16110 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
16120 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
16130 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
16140 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
16150 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42  )!=0.  ){.    pB
16160 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
16170 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
16180 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
16190 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
161a0 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
161b0 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
161c0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
161d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
161e0 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
161f0 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
16200 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
16210 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
16220 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16230 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
16240 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
16250 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
16260 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
16270 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
16280 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
16290 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
162a0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
162b0 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
162c0 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
162d0 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
162e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
162f0 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
16300 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
16310 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
16320 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
16330 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
16340 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
16350 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
16360 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16370 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
16380 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
16390 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
163a0 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
163b0 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
163c0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
163d0 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
163e0 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
163f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
16400 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
16410 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
16420 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
16430 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
16440 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
16450 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
16460 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
16470 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
16480 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
16490 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
164a0 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
164b0 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
164c0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
164d0 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
164e0 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
164f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
16500 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
16510 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
16520 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
16530 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
16540 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
16550 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
16560 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
16570 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
16580 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
16590 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
165a0 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
165b0 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
165c0 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
165d0 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
165e0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
165f0 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
16600 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
16610 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
16620 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
16630 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
16640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
16650 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
16660 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
16670 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
16680 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
16690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
166a0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
166b0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
166c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
166d0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
166e0 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
166f0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
16700 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
16710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16720 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
16730 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
16740 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16750 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
16760 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
16780 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
16790 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
167a0 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
167b0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
167c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
167d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
167e0 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
167f0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
16800 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
16810 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16820 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
16830 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
16840 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
16850 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
16860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16870 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16880 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
16890 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
168a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
168b0 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
168c0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
168d0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
168e0 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
168f0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
16900 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
16910 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
16920 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
16930 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
16940 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
16950 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
16960 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
16970 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
16980 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
16990 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
169a0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
169b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
169c0 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
169d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
169e0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
169f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
16a00 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
16a10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16a20 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16a30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16a40 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
16a50 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
16a60 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
16a70 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
16a80 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
16a90 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
16aa0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
16ab0 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
16ac0 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
16ad0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
16ae0 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
16af0 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
16b00 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
16b10 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
16b20 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
16b30 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
16b40 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
16b50 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
16b60 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
16b70 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
16b80 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
16b90 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
16ba0 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
16bb0 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
16bc0 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
16bd0 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
16be0 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
16bf0 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
16c00 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
16c10 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
16c20 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
16c30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
16c40 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
16c50 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
16c60 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
16c70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16c80 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
16c90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
16ca0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16cb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
16cc0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
16cd0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
16ce0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
16cf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16d00 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
16d10 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
16d20 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
16d30 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
16d40 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
16d50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
16d60 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
16d70 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
16d80 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
16d90 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
16da0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
16db0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
16dc0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
16dd0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
16de0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
16df0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
16e00 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
16e10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16e20 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
16e30 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
16e40 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
16e50 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
16e60 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
16e70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16e80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16e90 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
16ea0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16eb0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
16ec0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
16ed0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
16ee0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
16ef0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
16f00 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
16f10 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
16f20 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
16f30 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
16f40 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
16f50 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
16f60 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
16f70 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
16f80 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
16f90 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
16fa0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
16fd0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
16fe0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17010 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
17020 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
17030 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17050 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
17060 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17070 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
17080 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
17090 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
170a0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
170b0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
170c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
170d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
170e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
170f0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
17100 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
17110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17120 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
17130 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
17140 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
17150 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
17160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
17170 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
17180 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
17190 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
171a0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
171b0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
171c0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
171d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
171e0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
171f0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
17200 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
17210 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
17220 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
17230 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
17240 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17250 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
17260 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
17270 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
17280 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
17290 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
172a0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
172b0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
172c0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
172d0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
172e0 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
172f0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
17300 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
17310 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
17320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
17330 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
17340 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17350 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
17360 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
17370 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
17380 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
17390 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
173a0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
173b0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
173c0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
173d0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
173e0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
173f0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
17400 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
17410 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
17420 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
17450 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
17460 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
17470 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
17480 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
17490 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
174a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
174b0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
174c0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
174d0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
174e0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
174f0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
17500 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
17510 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
17520 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
17530 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
17540 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
17550 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
17560 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
17570 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
17580 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
17590 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
175a0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
175b0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
175c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
175d0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
175e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
175f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
17600 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
17610 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
17620 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
17630 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
17640 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
17650 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
17660 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
17670 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
17680 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
17690 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
176a0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
176b0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
176c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
176d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
176e0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
176f0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
17700 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
17710 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
17720 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
17730 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
17740 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
17750 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
17760 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
17770 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
17780 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
17790 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
177a0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
177b0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
177c0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
177d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
177e0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
177f0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
17800 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
17810 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
17820 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
17830 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
17840 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ow.         && p
17850 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
17860 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44  low+3<=pPage->aD
17870 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
17880 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  age.         && 
17890 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
178a0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
178b0 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20  rflow]).        
178c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
178d0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
178e0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
178f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
17900 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
17910 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17920 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
17930 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
17940 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
17950 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
17960 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
17970 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
17980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
17990 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
179a0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
179b0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
179c0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
179d0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
179e0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
179f0 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
17a00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
17a10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
17a20 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
17a30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
17a40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
17a50 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
17a60 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
17a70 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
17a80 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
17a90 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17aa0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
17ab0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
17ac0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
17ad0 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
17ae0 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
17af0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
17b00 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
17b10 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
17b20 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
17b30 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
17b40 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
17b50 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
17b60 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
17b70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
17b80 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
17b90 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
17ba0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
17bb0 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
17bc0 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
17bd0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
17be0 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
17bf0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
17c00 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
17c10 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
17c20 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
17c30 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
17c40 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
17c50 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
17c60 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
17c70 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
17c80 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
17c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
17ca0 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
17cb0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
17cc0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
17cd0 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
17ce0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
17cf0 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
17d00 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
17d10 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
17d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17d30 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
17d40 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
17d50 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
17d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
17d70 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
17d80 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
17d90 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
17da0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
17db0 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
17dc0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
17dd0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
17de0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
17df0 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
17e00 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
17e10 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
17e20 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
17e30 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
17e40 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
17e50 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
17e60 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
17e70 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
17e80 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
17e90 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
17ea0 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
17eb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17ec0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
17ed0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
17ee0 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
17ef0 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
17f00 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
17f10 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
17f20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
17f30 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
17f40 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
17f50 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
17f60 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
17f70 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
17f80 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
17f90 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
17fa0 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
17fb0 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
17fc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17fd0 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
17fe0 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
17ff0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
18000 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
18010 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18020 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18030 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
18040 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
18050 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
18060 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
18070 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
18080 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
18090 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
180a0 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
180b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
180c0 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
180d0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
180e0 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
180f0 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
18100 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
18110 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
18120 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
18130 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
18140 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
18150 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
18160 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
18170 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
18180 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
18190 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
181a0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
181b0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
181c0 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
181d0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
181e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
181f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
18200 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
18210 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
18220 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
18230 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
18240 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18260 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18270 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
18280 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
18290 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
182a0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
182b0 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
182c0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
182d0 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
182e0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
182f0 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
18300 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18320 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18340 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
18350 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
18360 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
18370 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
18380 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
18390 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
183a0 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
183b0 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
183c0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
183d0 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
183e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
183f0 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
18400 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
18410 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
18420 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
18430 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
18440 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18450 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18460 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
18470 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
18480 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
18490 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
184a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
184b0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
184c0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
184d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
184e0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
184f0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
18500 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
18510 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
18520 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
18530 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
18540 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
18550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18560 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
18570 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
18580 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
18590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
185a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
185b0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
185c0 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
185d0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
185e0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
185f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
18600 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
18610 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
18620 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
18630 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
18640 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
18650 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
18660 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
18670 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
18680 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
18690 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
186a0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
186b0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20  no point in .** 
186c0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
186d0 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
186e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
186f0 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
18700 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65  r .** occurs, re
18710 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  turn some other 
18720 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
18730 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c  * More specificl
18740 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
18750 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
18760 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
18770 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
18780 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
18790 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
187a0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
187b0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
187c0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
187d0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
187e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
187f0 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
18800 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
18810 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
18820 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
18830 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
18840 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
18850 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
18860 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
18870 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
18880 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
18890 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
188a0 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
188b0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
188c0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
188d0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
188e0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
188f0 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
18900 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
18910 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
18920 6d 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  mmmit .** operat
18930 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
18940 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
18950 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
18960 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
18970 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
18980 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
18990 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
189a0 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
189b0 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
189c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
189d0 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
189e0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
189f0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
18a00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18a10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
18a20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
18a30 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
18a40 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
18a50 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
18a60 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
18a70 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
18a80 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
18a90 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
18aa0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
18ab0 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
18ac0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
18ad0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
18ae0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
18af0 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
18b00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18b10 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
18b20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
18b30 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
18b40 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
18b50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
18b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18b70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18b80 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
18b90 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
18ba0 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
18bb0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18bc0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
18bd0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
18be0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
18bf0 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
18c00 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
18c10 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
18c20 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
18c30 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
18c40 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
18c50 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
18c60 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
18c70 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
18c80 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
18c90 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
18ca0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
18cb0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
18cc0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
18cd0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
18ce0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
18cf0 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
18d00 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
18d10 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
18d20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18d30 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
18d40 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
18d50 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
18d60 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
18d70 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
18d80 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
18d90 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
18da0 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
18db0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
18df0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
18e00 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
18e10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18e20 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
18e30 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
18e40 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
18e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18e60 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
18e70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
18e80 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
18e90 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
18ea0 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
18eb0 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
18ec0 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
18ed0 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
18ee0 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
18ef0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
18f00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
18f10 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
18f20 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
18f30 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
18f40 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
18f50 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
18f60 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
18f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18fa0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18fb0 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
18fc0 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
18fd0 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
18fe0 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
18ff0 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
19000 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
19010 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
19020 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
19030 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
19040 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
19050 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
19060 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
19070 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
19080 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
19090 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
190a0 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
190b0 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
190c0 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
190d0 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
190e0 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
190f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19100 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
19110 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
19120 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
19130 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
19140 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
19150 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
19160 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
19170 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
19180 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
19190 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
191a0 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
191b0 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
191c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
191d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
191e0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
191f0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
19200 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19210 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
19220 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
19230 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
19240 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
19250 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
19260 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
19270 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
19280 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
19290 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
192a0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
192b0 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
192c0 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
192d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
192e0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
192f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19300 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
19310 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
19320 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
19330 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
19340 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
19350 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
19360 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
19370 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
19380 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
19390 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
193a0 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
193b0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
193c0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
193d0 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
193e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
193f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
19400 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
19410 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
19420 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
19430 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
19440 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
19450 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
19460 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
19470 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
19480 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
19490 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
194a0 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
194b0 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
194c0 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
194d0 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
194e0 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
194f0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
19500 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
19510 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19530 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19540 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
19550 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
19560 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
19590 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
195a0 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
195b0 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
195c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
195d0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
195e0 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
195f0 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
19600 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
19610 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
19620 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
19630 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
19640 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
19650 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
19660 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
19670 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
19680 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
19690 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
196a0 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
196b0 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
196c0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
196d0 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
196e0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
196f0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
19700 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
19710 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
19720 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
19730 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
19740 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
19750 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
19760 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
19770 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
19780 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
19790 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
197a0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
197b0 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
197c0 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
197d0 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
197e0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
197f0 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
19800 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
19810 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
19820 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
19830 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
19840 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
19850 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
19860 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
19870 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
19880 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
19890 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
198a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
198b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
198c0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
198d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
198e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
198f0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
19900 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
19910 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19920 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
19930 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
19940 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19950 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
19960 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
19970 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
19980 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
19990 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
199a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
199b0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
199c0 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
199d0 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
199e0 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
199f0 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
19a00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19a10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19a20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
19a30 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
19a40 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
19a50 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
19a60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19a80 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
19a90 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
19aa0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19ab0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
19ac0 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
19ad0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
19ae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19af0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19b00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19b10 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
19b20 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
19b30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
19b40 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
19b50 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
19b60 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
19b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19b80 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
19b90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
19ba0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19bb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19bc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
19bd0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
19be0 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
19bf0 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
19c00 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
19c10 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
19c20 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
19c30 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
19c40 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
19c50 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
19c60 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
19c70 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
19c80 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
19c90 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
19ca0 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
19cb0 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
19cc0 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
19cd0 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
19ce0 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
19cf0 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
19d00 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
19d10 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
19d20 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
19d30 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
19d40 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
19d50 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
19d60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19d70 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
19d80 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
19d90 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
19da0 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
19db0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
19dc0 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65  ager) );..  asse
19dd0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
19de0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
19df0 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
19e00 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
19e10 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
19e20 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
19e30 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
19e40 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
19e50 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
19e60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19e70 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
19e80 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
19e90 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
19ea0 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
19eb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19ec0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
19ed0 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
19ee0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
19ef0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
19f00 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
19f10 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
19f20 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
19f30 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
19f40 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
19f50 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
19f60 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
19f70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
19f80 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
19f90 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
19fa0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
19fb0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
19fc0 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
19fd0 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
19fe0 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
19ff0 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
1a000 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
1a010 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
1a020 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
1a030 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
1a040 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
1a050 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
1a060 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
1a070 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
1a080 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1a090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1a0a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1a0b0 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
1a0c0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1a0d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1a0e0 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
1a0f0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1a100 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
1a110 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
1a120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1a130 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1a140 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
1a150 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1a160 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1a170 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1a180 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
1a190 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
1a1a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1a1b0 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
1a1c0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1a1d0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1a1e0 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
1a1f0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1a200 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
1a210 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
1a220 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1a230 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a240 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1a250 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1a260 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1a270 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1a280 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
1a290 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1a2a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1a2b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1a2c0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1a2d0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
1a2e0 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
1a2f0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1a300 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1a310 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
1a320 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1a340 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1a350 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1a360 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1a370 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
1a380 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1a390 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
1a3a0 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
1a3b0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
1a3c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
1a3d0 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
1a3e0 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
1a3f0 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
1a400 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1a410 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1a420 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
1a430 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1a440 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1a450 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
1a460 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
1a470 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
1a480 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1a490 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
1a4a0 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
1a4b0 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
1a4c0 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
1a4d0 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
1a4e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
1a4f0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
1a500 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1a510 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
1a520 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
1a530 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
1a540 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
1a550 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
1a560 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
1a570 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
1a580 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
1a590 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
1a5a0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
1a5b0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
1a5c0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1a5d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a5e0 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
1a5f0 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
1a600 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
1a610 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
1a620 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
1a630 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
1a640 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
1a650 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
1a660 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
1a670 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
1a680 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
1a690 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
1a6a0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1a6b0 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
1a6c0 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
1a6d0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1a6e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
1a6f0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
1a700 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
1a710 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
1a720 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
1a730 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1a740 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
1a750 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1a760 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
1a770 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
1a780 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
1a790 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a7a0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1a7b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1a7c0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
1a7d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
1a7e0 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
1a7f0 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
1a800 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
1a810 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
1a820 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1a830 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
1a840 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
1a850 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
1a860 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
1a870 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
1a880 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
1a890 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
1a8a0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
1a8b0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1a8c0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
1a8d0 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
1a8e0 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
1a8f0 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
1a900 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
1a910 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
1a920 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
1a930 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
1a940 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
1a950 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a960 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1a970 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
1a980 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
1a990 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1a9a0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
1a9b0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1a9c0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1a9d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1a9e0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1a9f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
1aa00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1aa10 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1aa20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1aa30 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
1aa40 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
1aa50 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
1aa60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1aa70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
1aa80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1aa90 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1aaa0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1aab0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1aac0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
1aad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1aae0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1aaf0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
1ab00 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
1ab10 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
1ab20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1ab30 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
1ab40 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
1ab50 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1ab60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1ab70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ab80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ab90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1aba0 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
1abb0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1abc0 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
1abd0 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
1abe0 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
1abf0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
1ac00 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
1ac10 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
1ac20 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
1ac30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1ac40 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
1ac50 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
1ac60 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1ac70 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1ac80 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1ac90 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1aca0 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
1acb0 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
1acc0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1acd0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
1ace0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
1acf0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1ad00 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
1ad10 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
1ad20 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
1ad30 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
1ad40 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
1ad50 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
1ad60 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
1ad70 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
1ad80 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
1ad90 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
1ada0 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
1adb0 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
1adc0 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
1add0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1ade0 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
1adf0 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
1ae00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ae10 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1ae20 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
1ae30 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1ae40 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
1ae50 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1ae60 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
1ae70 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
1ae80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1ae90 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
1aea0 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
1aeb0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
1aec0 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
1aed0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1aee0 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
1aef0 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
1af00 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
1af10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
1af20 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
1af30 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
1af40 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
1af50 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1af60 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1af70 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
1af80 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
1af90 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
1afa0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1afb0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
1afc0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1afd0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
1afe0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1aff0 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
1b000 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
1b010 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
1b020 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
1b030 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
1b040 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
1b050 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
1b060 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
1b070 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
1b080 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1b090 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1b0a0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
1b0b0 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
1b0c0 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
1b0d0 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
1b0e0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
1b0f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b100 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
1b110 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1b120 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
1b130 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
1b140 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1b150 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
1b160 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
1b170 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
1b180 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
1b190 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
1b1a0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
1b1b0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
1b1c0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
1b1d0 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
1b1e0 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
1b1f0 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
1b200 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
1b210 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
1b220 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
1b230 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
1b240 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
1b250 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
1b260 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
1b270 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
1b280 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
1b290 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
1b2a0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
1b2b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1b2c0 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
1b2d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b2e0 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
1b2f0 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
1b300 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
1b310 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1b320 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
1b330 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
1b340 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
1b350 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
1b360 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
1b370 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1b380 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
1b390 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
1b3a0 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
1b3b0 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
1b3c0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
1b3d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1b3e0 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
1b3f0 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
1b400 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1b410 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
1b420 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
1b430 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
1b440 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
1b450 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1b460 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
1b470 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
1b480 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1b490 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
1b4a0 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
1b4b0 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
1b4c0 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
1b4d0 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
1b4e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
1b4f0 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1b500 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
1b510 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
1b520 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
1b530 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1b540 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
1b550 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
1b560 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
1b570 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
1b580 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
1b590 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
1b5a0 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
1b5b0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
1b5c0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
1b5d0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
1b5e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b5f0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
1b600 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
1b610 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
1b620 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
1b630 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
1b640 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1b650 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
1b660 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
1b670 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
1b680 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1b690 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b6a0 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
1b6b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1b6c0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1b6d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
1b6e0 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
1b6f0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
1b700 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
1b710 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
1b720 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
1b730 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
1b740 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1b750 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
1b760 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1b770 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1b780 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
1b790 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1b7a0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1b7b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b7c0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1b7d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b7e0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1b7f0 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
1b800 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1b810 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
1b820 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1b830 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1b840 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
1b850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1b860 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1b870 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b880 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54    }.    pBt->inT
1b890 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1b8a0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
1b8b0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
1b8c0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
1b8d0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1b8e0 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
1b8f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b910 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
1b920 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
1b930 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
1b940 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1b950 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
1b960 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1b970 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1b980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1b990 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1b9a0 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
1b9b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b9c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b9d0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1b9e0 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
1b9f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ba00 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1ba10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1ba20 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
1ba30 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
1ba40 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
1ba50 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
1ba60 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
1ba70 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53  ry cursor on BtS
1ba80 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1ba90 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1baa0 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
1bab0 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20  sor is tripped, 
1bac0 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
1bad0 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a  s that belong.**
1bae0 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
1baf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1bb00 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
1bb10 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20   sharing.** the 
1bb20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
1bb30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1bb40 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
1bb50 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
1bb60 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c  k occurs..** All
1bb70 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74   cursors using t
1bb80 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75  he same cache mu
1bb90 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a  st be tripped.**
1bba0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
1bbb0 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
1bbc0 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66  use the btree af
1bbd0 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ter.** the rollb
1bbe0 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61  ack.  The rollba
1bbf0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65  ck may have dele
1bc00 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72  ted tables.** or
1bc10 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65   moved root page
1bc20 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20  s, so it is not 
1bc30 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a  sufficient to.**
1bc40 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20   save the state 
1bc50 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
1bc60 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
1bc70 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1bc80 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1bc90 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1bca0 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
1bcb0 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
1bcc0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1bcd0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d 3d  ;.  if( pBtree==
1bce0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
1bcf0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1bd00 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70  pBtree);.  for(p
1bd10 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
1bd20 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1bd30 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  Next){.    int i
1bd40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1bd50 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
1bd60 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20  ;.    p->eState 
1bd70 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
1bd80 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
1bd90 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66  = errCode;.    f
1bda0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
1bdb0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1bdc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
1bdd0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1bde0 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
1bdf0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1be00 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1be10 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
1be20 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
1be30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1be40 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
1be50 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
1be60 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
1be70 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
1be80 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
1be90 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
1bea0 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
1beb0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1bec0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
1bed0 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
1bee0 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
1bef0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
1bf00 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1bf10 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1bf20 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1bf30 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1bf40 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
1bf50 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
1bf60 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
1bf70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1bf80 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
1bf90 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  p, int tripCode)
1bfa0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1bfb0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1bfc0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1bfd0 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69  *pPage1;..  sqli
1bfe0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1bff0 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
1c000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c010 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
1c020 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1c030 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1c040 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1c050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c060 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b   if( tripCode ){
1c070 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1c080 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
1c090 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20  p, tripCode);.  
1c0a0 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  }.  btreeIntegri
1c0b0 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
1c0c0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c0d0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1c0e0 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
1c0f0 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
1c100 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c110 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
1c120 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1c130 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
1c140 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
1c150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c160 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
1c170 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
1c180 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
1c190 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
1c1a0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
1c1b0 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
1c1c0 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65  all btreeGetPage
1c1d0 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
1c1e0 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
1c1f0 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
1c200 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
1c210 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
1c220 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  ( btreeGetPage(p
1c230 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
1c240 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
1c250 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
1c260 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
1c270 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
1c280 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
1c290 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
1c2a0 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
1c2b0 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
1c2c0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1c2d0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
1c2e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c2f0 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
1c300 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
1c310 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
1c320 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1c330 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
1c340 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
1c350 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
1c360 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
1c370 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c380 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1c390 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
1c3a0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
1c3b0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1c3c0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1c3d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1c3e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1c3f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
1c400 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
1c410 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1c420 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1c430 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f  on can can be ro
1c440 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
1c450 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
1c460 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
1c470 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
1c480 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
1c490 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
1c4a0 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
1c4b0 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1c4c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
1c4d0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1c4e0 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
1c4f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
1c500 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
1c510 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
1c520 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1c530 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
1c540 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
1c550 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
1c560 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
1c570 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
1c580 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
1c590 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
1c5a0 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
1c5b0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
1c5c0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
1c5d0 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
1c5e0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
1c5f0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1c600 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1c610 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1c620 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1c630 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
1c640 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
1c650 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
1c660 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
1c670 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
1c680 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
1c690 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1c6a0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
1c6b0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1c6c0 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
1c6d0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
1c6e0 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
1c6f0 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
1c700 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
1c710 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
1c720 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
1c730 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
1c740 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
1c750 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
1c760 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
1c770 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
1c780 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
1c790 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
1c7a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
1c7b0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1c7c0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1c7d0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
1c7e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1c7f0 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
1c800 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
1c810 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
1c820 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1c830 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1c840 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1c850 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1c860 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1c870 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  E );.  assert( (
1c880 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1c890 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
1c8a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1c8b0 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
1c8c0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1c8d0 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
1c8e0 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  point );.  asser
1c8f0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1c900 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1c910 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68  TE );.  /* At th
1c920 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
1c930 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1c940 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
1c950 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20  point with.  ** 
1c960 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
1c970 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
1c980 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
1c990 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
1c9a0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
1c9b0 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
1c9c0 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
1c9d0 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
1c9e0 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65  y.  ** such save
1c9f0 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
1ca00 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1ca10 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
1ca20 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f   is active..  */
1ca30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1ca40 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1ca50 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
1ca60 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71  Statement);.  sq
1ca70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1ca80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1ca90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
1caa0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
1cab0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
1cac0 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
1cad0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1cae0 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
1caf0 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
1cb00 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
1cb10 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
1cb20 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
1cb30 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
1cb40 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
1cb50 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
1cb60 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
1cb70 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
1cb80 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
1cb90 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
1cba0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1cbb0 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
1cbc0 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
1cbd0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1cbe0 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
1cbf0 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
1cc00 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
1cc10 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
1cc20 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
1cc30 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
1cc40 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
1cc50 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
1cc60 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
1cc70 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
1cc80 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
1cc90 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
1cca0 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
1ccb0 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
1ccc0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1ccd0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1cce0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
1ccf0 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
1cd00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1cd10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1cd20 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
1cd30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1cd40 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1cd50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
1cd60 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
1cd70 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
1cd80 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
1cd90 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
1cda0 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
1cdb0 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
1cdc0 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
1cdd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1cde0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
1cdf0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1ce00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ce10 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
1ce20 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
1ce30 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1ce40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ce50 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1ce60 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28  Savepoint<0 && (
1ce70 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1ce80 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1ce90 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  PTY)!=0 ){.     
1cea0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1ceb0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1cec0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1ced0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
1cee0 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
1cef0 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
1cf00 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
1cf10 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1cf20 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
1cf30 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
1cf40 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
1cf50 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
1cf60 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
1cf70 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
1cf80 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
1cf90 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
1cfa0 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
1cfb0 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
1cfc0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1cfd0 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
1cfe0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1cff0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1d000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d010 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1d020 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
1d030 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
1d040 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
1d050 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
1d060 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1d070 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1d080 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1d090 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
1d0a0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
1d0b0 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
1d0c0 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
1d0d0 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
1d0e0 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
1d0f0 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
1d100 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1d110 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
1d120 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
1d130 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1d140 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
1d150 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
1d160 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
1d170 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
1d180 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
1d190 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
1d1a0 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
1d1b0 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
1d1c0 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
1d1d0 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
1d1e0 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
1d1f0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
1d200 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
1d210 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
1d220 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
1d230 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
1d240 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
1d250 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
1d260 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
1d270 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
1d280 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
1d290 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
1d2a0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
1d2b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1d2c0 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
1d2d0 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
1d2e0 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
1d2f0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
1d300 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
1d310 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
1d320 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
1d330 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
1d340 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
1d350 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
1d360 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
1d370 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
1d380 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
1d390 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
1d3a0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
1d3b0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
1d3c0 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
1d3d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
1d3e0 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
1d3f0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
1d400 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
1d410 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
1d420 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
1d430 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
1d440 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1d450 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
1d460 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
1d470 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
1d480 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
1d490 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
1d4a0 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
1d4b0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
1d4c0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
1d4d0 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
1d4e0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1d4f0 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
1d500 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1d510 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d520 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
1d530 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
1d540 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
1d550 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
1d560 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
1d570 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1d580 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d590 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
1d5a0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1d5d0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1d5e0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d600 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1d610 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1d620 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1d650 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1d660 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1d670 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1d680 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1d690 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1d6a0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1d6b0 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
1d6c0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
1d6f0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
1d700 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d710 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
1d720 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1d730 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
1d740 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
1d750 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1d760 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
1d770 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1d780 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a  | wrFlag==1 );..
1d790 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1d7a0 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
1d7b0 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
1d7c0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
1d7d0 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
1d7e0 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
1d7f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
1d800 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
1d810 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
1d820 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
1d830 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
1d840 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
1d850 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
1d860 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
1d870 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
1d880 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
1d890 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1d8a0 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
1d8b0 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c  KeyInfo!=0, wrFl
1d8c0 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ag+1) );.  asser
1d8d0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1d8e0 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
1d8f0 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
1d900 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
1d910 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1d920 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
1d930 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
1d940 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
1d950 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1d960 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
1d970 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
1d980 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1d990 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1d9a0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
1d9b0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
1d9c0 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20  aData );..  if( 
1d9d0 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20  NEVER(wrFlag && 
1d9e0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1d9f0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1da00 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1da10 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
1da20 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  Y;.  }.  if( iTa
1da30 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
1da40 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
1da50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1da60 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
1da70 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
1da80 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
1da90 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
1daa0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
1dab0 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
1dac0 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
1dad0 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
1dae0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
1daf0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
1db00 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
1db10 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
1db20 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
1db30 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
1db40 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1db50 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
1db60 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
1db70 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1db80 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1db90 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
1dba0 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20  =BTCF_WriteFlag 
1dbb0 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  );.  pCur->curFl
1dbc0 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  ags = wrFlag;.  
1dbd0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1dbe0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1dbf0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1dc00 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1dc10 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1dc20 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1dc30 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1dc40 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1dc50 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
1dc60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dc70 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1dc80 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
1dc90 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1dcc0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1dcd0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1dd00 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1dd10 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1dd20 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1dd50 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1dd60 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1dd70 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1dda0 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
1ddb0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dde0 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
1ddf0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1de00 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1de10 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1de20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
1de30 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
1de40 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1de50 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
1de60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1de70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1de80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1de90 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
1dea0 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
1deb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
1dec0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
1ded0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
1dee0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
1def0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
1df00 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
1df10 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
1df20 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
1df30 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
1df40 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
1df50 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
1df60 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
1df70 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
1df80 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
1df90 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
1dfa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1dfb0 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
1dfc0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
1dfd0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
1dfe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1dff0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
1e000 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
1e010 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
1e020 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
1e030 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
1e040 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
1e050 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
1e060 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
1e070 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
1e080 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
1e090 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
1e0a0 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
1e0b0 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
1e0c0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
1e0d0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
1e0e0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
1e0f0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
1e100 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
1e110 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
1e120 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
1e130 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
1e140 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
1e150 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
1e160 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
1e170 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
1e180 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
1e190 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
1e1a0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
1e1b0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1e1c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e1d0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
1e1e0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
1e1f0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1e200 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e210 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
1e220 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e230 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
1e240 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1e250 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1e260 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
1e270 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1e280 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
1e290 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1e2a0 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
1e2b0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1e2c0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
1e2d0 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
1e2e0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
1e2f0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
1e300 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
1e310 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
1e320 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
1e330 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1e340 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1e350 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1e360 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1e370 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
1e380 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1e390 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
1e3a0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1e3b0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1e3c0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
1e3d0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1e3e0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1e3f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1e400 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d  Btree->db, pCur-
1e410 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >aOverflow);.   
1e420 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
1e430 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
1e440 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1e450 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1e460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1e480 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1e490 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1e4a0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1e4b0 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1e4c0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1e4d0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1e4e0 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1e4f0 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
1e500 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
1e510 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
1e520 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
1e530 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
1e540 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
1e550 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
1e560 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
1e570 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
1e580 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
1e590 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1e5a0 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
1e5b0 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
1e5c0 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
1e5d0 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
1e5e0 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
1e5f0 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
1e600 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
1e610 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
1e620 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
1e630 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
1e640 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
1e650 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
1e660 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
1e670 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
1e680 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
1e690 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
1e6a0 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
1e6b0 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
1e6c0 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
1e6d0 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20  doing agressive 
1e6e0 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77  inlining.)  So w
1e6f0 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e  e use a real fun
1e700 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56  ction.** for MSV
1e710 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f  C and a macro fo
1e720 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  r everything els
1e730 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37  e.  Ticket #2457
1e740 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1e750 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
1e760 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
1e770 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e780 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
1e790 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61  nfo;.    int iPa
1e7a0 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1e7b0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
1e7c0 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
1e7d0 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50  fo));.    btreeP
1e7e0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1e7f0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
1e800 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1e810 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
1e820 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1e830 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f   || memcmp(&info
1e840 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
1e850 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
1e860 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
1e870 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
1e880 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
1e890 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
1e8a0 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
1e8b0 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
1e8c0 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
1e8d0 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
1e8e0 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
1e8f0 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
1e900 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1e910 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
1e920 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1e930 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
1e940 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1e950 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  e;.      btreePa
1e960 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1e970 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
1e980 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
1e990 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
1e9a0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
1e9b0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
1e9c0 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Key;.    }else{.
1e9d0 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c        assertCell
1e9e0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1e9f0 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  }.  }.#else /* i
1ea00 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a  f not _MSC_VER *
1ea10 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63  /.  /* Use a mac
1ea20 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ro in all other 
1ea30 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61  compilers so tha
1ea40 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
1ea50 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65  s inlined */.#de
1ea60 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f  fine getCellInfo
1ea70 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1eab0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1eac0 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20  Size==0 ){      
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1eb00 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1eb10 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20  Cur->iPage;     
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1eb50 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1eb60 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1eb70 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1eb80 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1eb90 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 5c  >info);        \
1eba0 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
1ebb0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
1ebc0 64 4e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  dNKey;          
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
1ec50 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20  lInfo(pCur);    
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    \.  }.#endif /
1eca0 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23  * _MSC_VER */..#
1ecb0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
1ecc0 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
1ecd0 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
1ece0 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1ecf0 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
1ed00 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1ed10 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
1ed20 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
1ed30 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
1ed40 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
1ed50 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1ed60 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
1ed70 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
1ed80 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
1ed90 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
1eda0 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
1edb0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
1edc0 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
1edd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ede0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
1edf0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ee00 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
1ee10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ee20 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
1ee30 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
1ee40 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
1ee50 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
1ee60 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
1ee70 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
1ee80 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
1ee90 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
1eea0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
1eeb0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1eec0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
1eed0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
1eee0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1eef0 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
1ef00 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
1ef10 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
1ef20 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1ef30 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
1ef40 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
1ef50 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ef60 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
1ef70 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1ef80 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
1ef90 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
1efa0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1efb0 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
1efc0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
1efd0 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
1efe0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
1eff0 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
1f000 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1f010 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1f020 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
1f030 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1f040 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1f050 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1f060 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f070 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
1f080 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f090 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69  SOR_VALID );.  i
1f0a0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
1f0b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1f0c0 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b  .    *pSize = 0;
1f0d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65  .  }else{.    ge
1f0e0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1f0f0 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  .    *pSize = pC
1f100 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1f110 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f120 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f130 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1f140 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1f150 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
1f160 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
1f170 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
1f180 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
1f190 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1f1a0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
1f1b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
1f1c0 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e  nting to a non-N
1f1d0 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74  ULL.** valid ent
1f1e0 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
1f1f0 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  rds, the calling
1f200 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
1f210 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61  guarantee.** tha
1f220 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  t the cursor has
1f230 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d   Cursor.eState==
1f240 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
1f250 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
1f260 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68  ot possible.  Th
1f270 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1f280 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
1f290 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68  E_OK..** It migh
1f2a0 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62  t just as well b
1f2b0 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72  e a procedure (r
1f2c0 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62  eturning void) b
1f2d0 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a  ut we continue.*
1f2e0 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69  * to return an i
1f2f0 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f  nteger result co
1f300 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  de for historica
1f310 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e  l reasons..*/.in
1f320 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
1f330 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
1f340 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
1f350 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1f360 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f370 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1f380 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f390 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1f3a0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1f3b0 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
1f3c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1f3d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1f3e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
1f3f0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
1f400 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
1f410 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1f420 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
1f430 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
1f440 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
1f450 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1f460 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
1f470 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
1f480 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
1f490 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
1f4a0 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
1f4b0 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
1f4c0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
1f4d0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
1f4e0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
1f4f0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
1f500 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
1f510 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1f520 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
1f530 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1f540 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1f550 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
1f560 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1f570 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
1f580 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
1f590 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
1f5a0 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
1f5b0 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
1f5c0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1f5d0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1f5e0 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1f5f0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1f600 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1f610 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1f620 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1f630 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1f640 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1f650 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1f660 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1f670 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1f680 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1f690 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1f6a0 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1f6b0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1f6c0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1f6d0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1f6e0 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1f6f0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1f700 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1f710 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1f720 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1f730 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1f740 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1f750 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1f760 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1f770 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1f780 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1f790 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1f7a0 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1f7b0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1f7c0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1f7d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1f7e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1f7f0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f810 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
1f820 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
1f830 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1f840 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
1f850 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
1f860 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
1f870 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
1f880 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
1f890 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1f8a0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1f8b0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
1f8c0 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
1f8d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1f8e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1f8f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1f900 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1f910 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1f920 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1f930 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
1f940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f950 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f960 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
1f970 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1f980 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1f990 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
1f9a0 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
1f9b0 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
1f9c0 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
1f9d0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
1f9e0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1f9f0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
1fa00 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
1fa10 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
1fa20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
1fa30 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
1fa40 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
1fa50 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
1fa60 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
1fa70 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1fa80 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
1fa90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1faa0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1fab0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
1fac0 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
1fad0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
1fae0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
1faf0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1fb00 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
1fb10 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
1fb20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1fb30 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
1fb40 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
1fb50 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
1fb60 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
1fb70 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1fb80 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
1fb90 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
1fba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1fbb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
1fbc0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1fbd0 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
1fbe0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
1fbf0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
1fc00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1fc10 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
1fc20 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1fc30 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
1fc40 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
1fc50 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
1fc60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fc70 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1fc80 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
1fc90 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67  , &pPage, (ppPag
1fca0 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45  e==0) ? PAGER_GE
1fcb0 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
1fcc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
1fcd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1fce0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
1fcf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fd00 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
1fd10 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1fd20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
1fd30 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
1fd40 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
1fd50 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
1fd60 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
1fd70 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
1fd80 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
1fd90 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
1fda0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
1fdb0 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
1fdc0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
1fdd0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1fde0 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
1fdf0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
1fe00 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
1fe10 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
1fe20 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
1fe30 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
1fe40 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
1fe50 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
1fe60 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
1fe70 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
1fe80 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
1fe90 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
1fea0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1feb0 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
1fec0 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
1fed0 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
1fee0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1fef0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
1ff00 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
1ff10 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
1ff20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
1ff30 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
1ff40 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
1ff50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1ff60 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
1ff70 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
1ff80 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1ff90 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
1ffa0 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
1ffb0 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
1ffc0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
1ffd0 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
1ffe0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1fff0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
20000 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
20010 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
20020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20030 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
20040 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
20050 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
20060 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
20070 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
20080 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
20090 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
200a0 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
200b0 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
200c0 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
200d0 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
200e0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
200f0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
20100 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
20110 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
20120 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
20130 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
20140 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20170 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
20180 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
20190 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
201a0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
201b0 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
201c0 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
201d0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
201e0 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
201f0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
20200 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20210 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
20220 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
20230 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
20240 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
20250 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
20260 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
20270 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
20280 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
20290 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72  o. The eOp.** ar
202a0 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70  gument is interp
202b0 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
202c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65  :.**.**   0: The
202d0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
202e0 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74  read. Populate t
202f0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
20300 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f  e..**   1: The o
20310 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72  peration is a wr
20320 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ite. Populate th
20330 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
20340 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70  ..**   2: The op
20350 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
20360 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61  d. Do not popula
20370 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
20380 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
20390 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
203a0 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
203b0 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
203c0 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
203d0 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
203e0 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
203f0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
20400 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
20410 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
20420 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
20430 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
20440 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
20450 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
20460 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
20470 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
20480 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
20490 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
204a0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
204b0 70 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a  pages and the.**
204c0 20 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73   eOp argument is
204d0 20 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e   not 2, this fun
204e0 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
204f0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
20500 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 6c   lazily .** popl
20510 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
20520 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
20530 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
20540 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
20550 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
20560 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
20570 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
20580 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
20590 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
205a0 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
205b0 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
205c0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
205d0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
205e0 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
205f0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
20600 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
20610 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
20620 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
20630 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
20640 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
20650 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
20660 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
20670 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
20680 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
20690 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
206a0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
206b0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
206c0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
206d0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
206e0 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
206f0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
20700 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
20710 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
20720 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
20730 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
20740 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
20750 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
20760 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
20770 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
20780 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
20790 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
207a0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
207b0 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
207c0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
207d0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
207e0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
207f0 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20810 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
20820 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
20830 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
20840 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
20850 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
20860 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20880 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
20890 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
208a0 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
208b0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
208c0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
208d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
208e0 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
208f0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
20900 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
20910 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20920 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
20930 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
20940 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
20950 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
20960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20970 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
20980 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
20990 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
209a0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
209b0 4c 4f 57 5f 52 45 41 44 0a 20 20 69 6e 74 20 62  LOW_READ.  int b
209c0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
209f0 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
20a00 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
20a10 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
20a20 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
20a30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20a40 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
20a50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20a60 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20a70 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
20a80 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
20a90 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
20aa0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
20ab0 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
20ac0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 41  ==0 );      /* A
20ad0 6c 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d  lways start from
20ae0 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65   beginning for e
20af0 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43  Op==2 */..  getC
20b00 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
20b10 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
20b20 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
20b30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
20b40 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
20b50 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
20b60 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
20b70 2e 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53  .nKey);.#ifdef S
20b80 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
20b90 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e  RFLOW_READ.  bEn
20ba0 64 20 3d 20 28 6f 66 66 73 65 74 2b 61 6d 74 3d  d = (offset+amt=
20bb0 3d 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f  =nKey+pCur->info
20bc0 2e 6e 44 61 74 61 29 3b 0a 23 65 6e 64 69 66 0a  .nData);.#endif.
20bd0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
20be0 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
20bf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
20c00 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
20c10 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
20c20 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
20c30 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
20c40 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
20c50 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
20c60 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
20c70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
20c80 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
20c90 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
20ca0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20cb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
20cc0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
20cd0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
20ce0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
20cf0 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
20d00 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
20d10 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20d20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
20d30 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
20d40 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
20d50 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
20d60 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
20d70 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
20d80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
20d90 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
20da0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
20db0 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
20dc0 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
20dd0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
20de0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
20df0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
20e00 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
20e10 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
20e20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
20e30 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
20e40 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
20e50 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
20e60 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
20e70 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
20e80 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
20e90 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
20ea0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
20eb0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
20ec0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
20ed0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
20ee0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
20ef0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
20f00 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
20f10 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
20f20 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
20f30 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
20f40 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
20f50 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66   allocate aOverf
20f60 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32  low[] for eOp==2
20f70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
20f80 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  The aOverflow[] 
20f90 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
20fa0 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  t one entry for 
20fb0 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
20fc0 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
20fd0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
20fe0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
20ff0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
21000 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20  erflow page is. 
21010 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20     ** stored in 
21020 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74  aOverflow[0], et
21030 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
21040 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
21050 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  [] array.    ** 
21060 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
21070 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65  nown" (the cache
21080 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
21090 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
210a0 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20    if( eOp!=2 && 
210b0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
210c0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
210d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
210e0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
210f0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
21100 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21110 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
21120 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
21130 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
21140 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
21150 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
21160 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44 62  (Pgno*)sqlite3Db
21170 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
21180 20 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65       pCur->pBtre
21190 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76  e->db, pCur->aOv
211a0 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
211b0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
211c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
211d0 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
211e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
211f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21210 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
21220 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
21230 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
21240 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
21250 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
21260 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
21270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21280 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
21290 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
212a0 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
212b0 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Pgno));.        
212c0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
212d0 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
212e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
212f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
21300 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
21310 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
21320 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
21330 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
21340 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
21350 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
21360 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
21370 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
21380 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
21390 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
213a0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
213b0 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 26  _ValidOvfl)!=0 &
213c0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
213d0 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
213e0 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  e] ){.      iIdx
213f0 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
21400 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
21410 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
21420 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
21430 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
21440 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
21450 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20      }..    for( 
21460 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21470 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
21480 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
21490 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
214a0 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
214b0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
214c0 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
214d0 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d        if( (pCur-
214e0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
214f0 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29  _ValidOvfl)!=0 )
21500 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
21510 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
21520 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
21530 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
21540 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
21550 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
21560 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
21570 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tPage;.      }..
21580 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
21590 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
215a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
215b0 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
215c0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
215d0 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
215e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
215f0 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
21600 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
21610 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
21620 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
21630 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
21640 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
21650 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
21660 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
21670 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
21680 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
21690 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
216a0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
216b0 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
216c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
216d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
216e0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
216f0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
21700 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
21710 65 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d  ed because eOp!=
21720 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72  2.        ** her
21730 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74  e.  If eOp==2, t
21740 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e  hen offset==0 an
21750 64 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73  d this branch is
21760 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20   never taken..  
21770 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21780 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
21790 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
217a0 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  t( pCur->curFlag
217b0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
217c0 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fl );.        if
217d0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
217e0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
217f0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
21800 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
21810 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
21820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21830 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
21840 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
21850 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
21860 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
21870 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
21880 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
21890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
218a0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
218b0 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
218c0 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
218d0 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
218e0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
218f0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
21900 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
21910 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
21920 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
21930 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
21940 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
21950 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
21960 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
21970 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
21980 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
21990 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
219a0 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
219b0 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
219c0 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
219d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66  ;.        }..#if
219e0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
219f0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
21a00 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
21a10 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
21a20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
21a30 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
21a40 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72    1) this is a r
21a50 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  ead operation, a
21a60 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nd .        **  
21a70 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75   2) data is requ
21a80 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ired from the st
21a90 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72  art of this over
21aa0 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20  flow page, and. 
21ab0 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74         **   3) t
21ac0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
21ad0 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
21ae0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
21af0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
21b00 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
21b10 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
21b20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61  **   5) the data
21b30 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41  base is not a WA
21b40 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20  L database,.    
21b50 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20      **   6) all 
21b60 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61  data from the pa
21b70 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  ge is being read
21b80 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
21b90 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
21ba0 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
21bb0 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
21bc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
21bd0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
21be0 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
21bf0 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
21c00 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
21c10 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
21c20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
21c30 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
21c40 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
21c50 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
21c60 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
21c70 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
21c80 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20  &0x01)==0       
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21cb0 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
21cc0 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cf0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
21d00 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62  /.         && (b
21d10 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69  End || a==ovflSi
21d20 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ze)             
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
21d50 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
21d60 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
21d70 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
21d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
21d90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
21da0 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
21db0 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
21dc0 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
21dd0 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
21de0 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
21df0 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
21e00 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
21e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
21e20 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  5) */.        ){
21e30 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
21e40 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
21e50 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
21e60 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
21e70 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
21e80 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
21e90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21ea0 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
21eb0 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
21ec0 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
21ed0 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
21ee0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
21ef0 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
21f00 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
21f10 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
21f20 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
21f30 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
21f40 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
21f50 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
21f60 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
21f70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
21f80 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
21f90 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
21fa0 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
21fb0 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31        ((eOp&0x01
21fc0 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
21fd0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
21fe0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
21ff0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22010 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
22020 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
22030 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
22040 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
22050 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
22060 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
22070 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
22080 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
22090 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
220a0 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29  f, a, (eOp&0x01)
220b0 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
220c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
220d0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
220e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
220f0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
22100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22110 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
22120 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
22130 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
22140 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
22150 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22160 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
22170 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22180 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
22190 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
221a0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
221b0 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
221c0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
221d0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
221e0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
221f0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
22200 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
22210 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
22220 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
22230 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  "..**.** The cal
22240 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
22250 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
22260 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
22270 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74   row.** in the t
22280 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  able..**.** Retu
22290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
222a0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
222b0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
222c0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
222d0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
222e0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
222f0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
22300 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
22310 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
22320 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
22330 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
22340 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
22350 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
22360 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  oid *pBuf){.  as
22370 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22380 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22390 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
223a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
223b0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
223c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
223d0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
223e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
223f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22400 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22410 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
22420 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
22430 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
22440 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
22450 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
22460 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
22470 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
22480 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
22490 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
224a0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
224b0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
224c0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
224d0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
224e0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
224f0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
22500 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
22510 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
22520 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
22530 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
22540 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
22550 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
22560 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
22570 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
22580 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
22590 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
225a0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
225b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
225c0 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
225d0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
225e0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
225f0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
22600 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
22610 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
22620 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
22630 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22640 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
22650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
22660 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
22670 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
22680 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
22690 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
226a0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
226b0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
226c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
226d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
226e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
226f0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
22700 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
22710 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
22720 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22730 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22740 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22750 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
22760 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22770 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
22780 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
22790 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
227a0 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
227b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
227c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
227d0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
227e0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
227f0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
22800 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
22810 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
22820 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
22830 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
22840 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
22850 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64  * the key if ind
22860 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65  ex btrees (pPage
22870 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64  ->intKey==0) and
22880 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72   is the data for
22890 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73  .** table btrees
228a0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
228b0 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20  =1). The number 
228c0 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
228d0 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74  lable.** key/dat
228e0 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  a is written int
228f0 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
22900 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
22910 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65  value.** returne
22920 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20  d will not be a 
22930 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
22940 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22950 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
22960 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
22970 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
22980 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
22990 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
229a0 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
229b0 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
229c0 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
229d0 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
229e0 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
229f0 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
22a00 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
22a10 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
22a20 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
22a30 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
22a40 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
22a50 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
22a60 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
22a70 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
22a80 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
22a90 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
22aa0 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
22ab0 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
22ac0 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
22ad0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
22ae0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
22af0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
22b00 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
22b10 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
22b20 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
22b30 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
22b40 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
22b50 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
22b60 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
22b70 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
22b80 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
22b90 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68  onst void *fetch
22ba0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
22bb0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
22bc0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
22bd0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
22be0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
22bf0 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20  2 *pAmt         
22c00 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
22c10 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
22c20 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
22c30 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
22c40 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
22c50 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
22c60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22c70 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
22c80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22c90 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
22ca0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22cb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
22cc0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
22cd0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
22ce0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22cf0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
22d00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
22d10 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
22d20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22d30 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
22d40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22d50 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
22d60 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 70 43   );.  *pAmt = pC
22d70 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
22d80 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
22d90 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  )(pCur->info.pCe
22da0 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
22db0 6e 48 65 61 64 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  nHeader);.}.../*
22dc0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
22dd0 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
22de0 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
22df0 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
22e00 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
22e10 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
22e20 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
22e30 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
22e40 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
22e50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
22e60 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
22e70 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
22e80 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
22e90 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
22ea0 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
22eb0 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
22ec0 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
22ed0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
22ee0 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
22ef0 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
22f00 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
22f10 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
22f20 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
22f30 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
22f40 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
22f50 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
22f60 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
22f70 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
22f80 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
22f90 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
22fa0 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
22fb0 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
22fc0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
22fd0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
22fe0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
22ff0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
23000 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
23010 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
23020 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
23030 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
23040 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
23050 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
23060 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
23070 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
23080 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
23090 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
230a0 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
230b0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
230c0 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
230d0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
230e0 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
230f0 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
23100 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
23110 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
23120 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
23130 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
23140 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
23150 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
23160 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
23170 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
23180 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
23190 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
231a0 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
231b0 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
231c0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
231d0 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
231e0 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
231f0 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
23200 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
23210 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
23220 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
23230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
23240 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
23250 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
23260 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Pgno){.  int rc;
23270 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d  .  int i = pCur-
23280 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  >iPage;.  MemPag
23290 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42  e *pNewPage;.  B
232a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
232b0 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
232c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
232d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
232e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
232f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23300 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
23310 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
23320 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
23330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23340 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
23350 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
23360 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
23370 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
23380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
23390 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
233a0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
233b0 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
233c0 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20  no, &pNewPage,. 
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
233e0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
233f0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
23400 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
23410 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
23420 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
23430 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61  rc;.  pCur->apPa
23440 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61  ge[i+1] = pNewPa
23450 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ge;.  pCur->aiId
23460 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43  x[i+1] = 0;.  pC
23470 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20  ur->iPage++;..  
23480 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
23490 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
234a0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
234b0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
234c0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66  ValidOvfl);.  if
234d0 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
234e0 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d  l<1 || pNewPage-
234f0 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61  >intKey!=pCur->a
23500 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79  pPage[i]->intKey
23510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
23520 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23530 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
23540 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
23550 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  if 0./*.** Page 
23560 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
23570 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
23580 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
23590 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
235a0 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
235b0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
235c0 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
235d0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
235e0 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
235f0 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
23600 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
23610 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
23620 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
23630 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
23640 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
23650 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
23660 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
23670 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
23680 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
23690 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
236a0 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
236b0 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
236c0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
236d0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
236e0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
236f0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
23700 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
23710 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
23720 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
23730 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
23740 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
23750 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
23760 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
23770 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
23780 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
23790 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
237a0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
237b0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
237c0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
237d0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
237e0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
237f0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
23800 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
23810 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
23820 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
23830 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
23840 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
23850 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
23860 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
23870 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
23880 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
23890 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
238a0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
238b0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
238c0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
238d0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
238e0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
238f0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
23900 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23910 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23920 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
23930 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
23940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23950 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
23960 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
23970 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23980 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54  ] );..  /* UPDAT
23990 45 3a 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c  E: It is actuall
239a0 79 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  y possible for t
239b0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73  he condition tes
239c0 74 65 64 20 62 79 20 74 68 65 20 61 73 73 65 72  ted by the asser
239d0 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20  t.  ** below to 
239e0 62 65 20 75 6e 74 72 75 65 20 69 66 20 74 68 65  be untrue if the
239f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
23a00 73 20 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20  s corrupt. This 
23a10 63 61 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a  can occur if.  *
23a20 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73  * one cursor has
23a30 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 70   modified page p
23a40 50 61 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72  Parent while a r
23a50 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69  eference to it i
23a60 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20  s held .  ** by 
23a70 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e  a second cursor.
23a80 20 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   Which can only 
23a90 68 61 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67  happen if a sing
23aa0 6c 65 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65  le page is linke
23ab0 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65  d.  ** into more
23ac0 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
23ad0 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 61 20   structure in a 
23ae0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
23af0 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  .  */.#if 0.  as
23b00 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
23b10 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
23b20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
23b30 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
23b40 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
23b50 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
23b60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23b70 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e  ]->pgno.  );.#en
23b80 64 69 66 0a 20 20 74 65 73 74 63 61 73 65 28 20  dif.  testcase( 
23b90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23ba0 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
23bb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23bc0 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
23bd0 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  );..  releasePag
23be0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
23bf0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
23c00 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
23c10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
23c20 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
23c30 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
23c40 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
23c50 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a  _ValidOvfl);.}..
23c60 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
23c70 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
23c80 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
23c90 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
23ca0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
23cb0 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
23cc0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
23cd0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
23ce0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
23cf0 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
23d00 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
23d10 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
23d20 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
23d30 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
23d40 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
23d50 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
23d60 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
23d70 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
23d80 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
23d90 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
23da0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
23db0 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
23dc0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
23dd0 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
23de0 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
23df0 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
23e00 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
23e10 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
23e20 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
23e30 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
23e40 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
23e50 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
23e60 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
23e70 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
23e80 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
23e90 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
23ea0 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
23eb0 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
23ec0 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
23ed0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
23ee0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
23ef0 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
23f00 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
23f10 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
23f20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
23f30 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
23f40 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
23f50 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
23f60 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
23f70 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
23f80 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
23f90 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
23fa0 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
23fb0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
23fc0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
23fd0 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
23fe0 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
23ff0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
24000 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
24010 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
24020 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
24030 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
24040 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
24050 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
24060 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
24070 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
24080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24090 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
240a0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
240b0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
240c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
240d0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
240e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
240f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24100 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
24110 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
24120 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
24130 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
24140 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
24150 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
24160 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
24170 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
24180 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
24190 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
241a0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
241b0 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
241c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
241d0 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
241e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
241f0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
24200 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74  _OK );.      ret
24210 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
24220 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
24230 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
24240 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
24250 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
24260 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68  age>=0 ){.    wh
24270 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ile( pCur->iPage
24280 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 28 70   ) releasePage(p
24290 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
242a0 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d  ->iPage--]);.  }
242b0 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70  else if( pCur->p
242c0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  gnoRoot==0 ){.  
242d0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
242e0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
242f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24300 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
24310 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
24320 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42  nitPage(pCur->pB
24330 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d  tree->pBt, pCur-
24340 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
24350 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20  ->apPage[0],.   
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
24370 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
24380 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
24390 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
243a0 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
243b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
243c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
243d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
243e0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
243f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24400 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
24410 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52  ge = 0;.  }.  pR
24420 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
24430 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
24440 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
24450 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
24460 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70  .  /* If pCur->p
24470 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
24480 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
24490 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
244a0 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a   this cursor.  *
244b0 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70  * expected to op
244c0 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65  en it on an inde
244d0 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77  x b-tree. Otherw
244e0 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f  ise, if pKeyInfo
244f0 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74   is.  ** NULL, t
24500 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74  he caller expect
24510 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  s a table b-tree
24520 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
24530 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20   the case,.  ** 
24540 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
24550 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
24560 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69  .  **.  ** Earli
24570 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
24580 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68  QLite assumed th
24590 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75  at this test cou
245a0 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a  ld not fail.  **
245b0 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   if the root pag
245c0 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f  e was already lo
245d0 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  aded when this f
245e0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
245f0 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66  ed (i.e..  ** if
24600 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29   pCur->iPage>=0)
24610 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f  . But this is no
24620 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61  t so if the data
24630 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65  base is corrupte
24640 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20  d .  ** in such 
24650 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20  a way that page 
24660 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20  pRoot is linked 
24670 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d  into a second b-
24680 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a  tree table .  **
24690 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73   (or the freelis
246a0 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t).  */.  assert
246b0 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  ( pRoot->intKey=
246c0 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74  =1 || pRoot->int
246d0 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Key==0 );.  if( 
246e0 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30  pRoot->isInit==0
246f0 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49   || (pCur->pKeyI
24700 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e  nfo==0)!=pRoot->
24710 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
24720 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24730 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
24740 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
24750 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
24760 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
24770 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
24780 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
24790 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
247a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a  CF_ValidOvfl);..
247b0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
247c0 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ll>0 ){.    pCur
247d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
247e0 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
247f0 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61   if( !pRoot->lea
24800 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
24810 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
24820 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
24830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
24840 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
24850 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
24860 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
24870 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
24880 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
24890 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
248a0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
248b0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
248c0 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
248d0 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
248e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
248f0 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72  INVALID;.  }.  r
24900 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24910 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
24920 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
24930 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
24940 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
24950 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
24960 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
24970 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
24980 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
24990 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
249a0 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
249b0 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
249c0 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
249d0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
249e0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
249f0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
24a00 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
24a10 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
24a20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
24a30 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
24a40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24a50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24a60 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24a70 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24a80 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
24a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24aa0 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
24ab0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24ac0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
24ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
24ae0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24af0 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
24b00 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
24b10 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
24b20 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
24b30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24b40 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
24b50 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
24b60 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
24b70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24b80 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
24b90 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
24ba0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
24bb0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
24bc0 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
24bd0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
24be0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
24bf0 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
24c00 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
24c10 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
24c20 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
24c30 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
24c40 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
24c50 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
24c60 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
24c70 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
24c80 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
24c90 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
24ca0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
24cb0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
24cc0 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
24cd0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
24ce0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
24cf0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
24d00 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
24d10 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
24d20 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
24d30 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
24d40 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
24d50 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
24d60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24d70 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
24d80 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
24d90 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24da0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
24db0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24dc0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24dd0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
24de0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
24df0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
24e00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24e10 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
24e20 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
24e30 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
24e40 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
24e50 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
24e60 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24e70 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
24e80 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
24e90 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
24ea0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
24eb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24ec0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
24ed0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24ee0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
24ef0 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
24f00 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
24f10 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
24f20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4e 4b  &= ~BTCF_ValidNK
24f30 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ey;.  }.  return
24f40 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
24f50 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
24f60 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
24f70 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
24f80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
24f90 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
24fa0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
24fb0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
24fc0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
24fd0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
24fe0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
24ff0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
25000 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
25010 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
25020 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
25030 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
25040 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
25050 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25060 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
25070 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25080 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
25090 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
250a0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
250b0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
250c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
250d0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
250e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
250f0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61  VALID ){.      a
25100 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
25110 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
25120 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25130 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
25140 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
25150 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
25160 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
25170 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25180 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
25190 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
251a0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
251b0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
251c0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
251d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
251e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
251f0 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
25200 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
25210 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
25220 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
25230 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
25240 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
25250 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
25260 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
25270 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
25280 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
25290 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
252a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
252b0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
252c0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
252d0 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
252e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
252f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25300 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25310 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
25320 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
25330 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
25340 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
25350 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
25360 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
25370 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
25380 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
25390 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
253a0 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  e && (pCur->curF
253b0 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
253c0 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66  st)!=0 ){.#ifdef
253d0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
253e0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
253f0 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
25400 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
25410 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
25420 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
25430 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
25440 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
25450 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
25460 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
25470 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
25480 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25490 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
254a0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
254b0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
254c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
254d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
254e0 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
254f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25500 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
25510 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25520 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25530 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
25540 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
25550 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
25560 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
25570 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
25580 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25590 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
255a0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
255b0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
255c0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
255d0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
255e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
255f0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
25600 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
25610 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25620 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25630 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25640 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
25650 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
25660 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
25670 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
25680 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
256a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
256b0 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
256c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
256d0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
256e0 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73  s &= ~BTCF_AtLas
256f0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20  t;.      }.   . 
25700 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
25720 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
25730 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
25740 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
25750 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
25760 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
25770 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
25780 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
25790 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
257a0 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
257b0 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
257c0 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
257d0 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
257e0 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
257f0 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
25800 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
25810 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
25820 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
25830 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
25840 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
25850 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
25860 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
25870 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
25880 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
25890 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
258a0 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
258b0 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
258c0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
258d0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
258e0 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
258f0 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
25900 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
25910 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
25920 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
25930 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
25940 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
25950 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
25960 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
25970 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
25980 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
25990 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
259a0 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
259b0 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
259c0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
259d0 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
259e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
259f0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
25a00 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
25a30 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
25a40 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
25a50 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
25a60 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
25a70 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
25a80 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
25a90 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
25aa0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
25ab0 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
25ac0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
25ad0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
25ae0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
25af0 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
25b00 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
25b10 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
25b20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
25b30 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
25b40 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
25b50 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
25b70 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
25b80 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
25b90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25ba0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
25bb0 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
25bc0 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
25bd0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
25be0 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
25bf0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
25c00 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
25c10 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
25c20 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
25c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25c40 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
25c50 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
25c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
25c70 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
25c80 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
25c90 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
25ca0 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
25cb0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
25cc0 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
25cd0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
25ce0 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
25cf0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
25d00 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
25d10 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25d20 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25d30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
25d40 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
25d50 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
25d60 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b   assert( pRes );
25d70 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
25d80 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
25d90 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
25da0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
25db0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
25dc0 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
25dd0 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
25de0 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
25df0 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
25e00 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
25e10 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
25e20 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
25e30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25e40 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  D && (pCur->curF
25e50 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
25e60 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20  dNKey)!=0.   && 
25e70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
25e80 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20  >intKey .  ){.  
25e90 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
25ea0 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
25eb0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
25ec0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
25ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
25ee0 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
25ef0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
25f00 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43 75  tLast)!=0 && pCu
25f10 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
25f20 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
25f30 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
25f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25f50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
25f60 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
25f70 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
25f80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  = sqlite3VdbeFin
25f90 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79  dCompare(pIdxKey
25fa0 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  );.    pIdxKey->
25fb0 69 73 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20  isCorrupt = 0;. 
25fc0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
25fd0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
25fe0 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
25ff0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
26000 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
26010 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
26020 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
26030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
26040 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
26050 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
26060 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
26070 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
26080 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
26090 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
260a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
260b0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
260c0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
260d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
260e0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
260f0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
26100 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
26110 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26120 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
26130 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
26140 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
26150 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
26160 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
26170 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
26180 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
26190 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
261a0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
261b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
261c0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
261d0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
261e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
261f0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
26200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26210 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
26220 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
26230 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
26240 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
26250 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
26260 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e   idx, c;.    Pgn
26270 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
26280 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
26290 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
262a0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38  ->iPage];.    u8
262b0 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
262c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
262e0 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
262f0 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
26300 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
26310 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
26320 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
26330 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
26340 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
26350 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
26360 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
26370 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
26380 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
26390 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
263a0 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
263b0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
263c0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
263d0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
263e0 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
263f0 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
26400 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
26410 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
26420 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
26430 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
26440 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
26450 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
26460 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
26470 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
26480 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
26490 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
264a0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
264b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
264c0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
264d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
264e0 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
264f0 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
26500 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
26510 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
26520 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
26530 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
26540 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
26550 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
26560 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
26570 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
26580 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
26590 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
265a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
265b0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
265c0 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
265d0 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
265e0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
265f0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
26600 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
26610 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
26620 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
26630 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
26640 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
26650 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
26660 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30       while( 0x80
26670 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29   <= *(pCell++) )
26680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
26690 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e  ( pCell>=pPage->
266a0 61 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72  aDataEnd ) retur
266b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
266c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
266d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
266e0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
266f0 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
26700 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
26710 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
26720 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
26730 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
26740 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
26750 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62  upr ){ c = -1; b
26760 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
26770 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
26780 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey>intKey ){.   
26790 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
267a0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  -1;.          if
267b0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
267c0 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   +1; break; }.  
267d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
267e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
267f0 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
26800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
26810 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
26820 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
26830 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
26840 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
26850 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
26860 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26870 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
26880 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
26890 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
268a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
268b0 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
268c0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
268d0 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
268e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
268f0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
26900 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
26910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26920 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26930 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
26940 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
26960 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
26970 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
26980 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
26990 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
269a0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
269b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
269c0 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
269d0 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a       int nCell;.
269e0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
269f0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
26a00 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
26a10 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20  ildPtrSize;..   
26a20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
26a30 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
26a40 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
26a50 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
26a60 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
26a70 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
26a80 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
26a90 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
26aa0 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
26ab0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
26ac0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
26ad0 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
26ae0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
26af0 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
26b00 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
26b10 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
26b20 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
26b30 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
26b40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
26b50 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
26b60 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
26b70 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
26b80 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
26b90 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
26ba0 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
26bb0 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
26bc0 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
26bd0 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
26be0 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
26bf0 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
26c00 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
26c10 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
26c20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
26c30 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
26c40 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
26c50 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
26c60 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
26c70 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
26c80 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
26c90 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
26ca0 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
26cb0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
26cc0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
26cd0 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
26ce0 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
26cf0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
26d00 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
26d10 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e  nCell+1==pPage->
26d20 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
26d30 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
26d40 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
26d50 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d  (void*)&pCell[1]
26d60 2c 20 70 49 64 78 4b 65 79 2c 20 30 29 3b 0a 20  , pIdxKey, 0);. 
26d70 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
26d80 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
26d90 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
26da0 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
26db0 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
26dc0 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
26dd0 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
26de0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
26df0 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
26e00 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
26e10 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
26e20 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
26e30 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
26e40 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
26e50 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
26e60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
26e70 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
26e80 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+2==pPage->aDa
26e90 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
26ea0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
26eb0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
26ec0 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
26ed0 49 64 78 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  IdxKey, 0);.    
26ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
26f00 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
26f10 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
26f20 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
26f30 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
26f40 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
26f50 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
26f60 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
26f70 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
26f80 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
26f90 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
26fa0 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
26fb0 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
26fc0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
26fd0 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
26fe0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
26ff0 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
27000 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
27010 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
27020 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
27030 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
27040 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
27050 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
27060 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
27070 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
27080 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
27090 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
270a0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
270b0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
270c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
270d0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
270e0 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20  lloc( nCell );. 
270f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
27100 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
27110 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27120 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
27130 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
27140 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
27150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27160 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27170 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
27180 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
27190 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
271a0 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
271b0 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
271c0 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b  r*)pCellKey, 2);
271d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
271e0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
271f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
27200 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
27210 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
27220 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
27230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
27240 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
27250 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
27260 79 2c 20 70 49 64 78 4b 65 79 2c 20 30 29 3b 0a  y, pIdxKey, 0);.
27270 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27280 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
27290 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
272a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
272b0 4b 65 79 2d 3e 69 73 43 6f 72 72 75 70 74 3d 3d  Key->isCorrupt==
272c0 30 20 7c 7c 20 63 3d 3d 30 20 29 3b 0a 20 20 20  0 || c==0 );.   
272d0 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
272e0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
272f0 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx+1;.        }
27300 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a  else if( c>0 ){.
27310 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
27320 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx-1;.        }
27330 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27340 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a  assert( c==0 );.
27350 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
27360 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
27370 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27380 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
27390 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
273a0 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
273b0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
273c0 4b 65 79 2d 3e 69 73 43 6f 72 72 75 70 74 20 29  Key->isCorrupt )
273d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
273e0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
273f0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
27400 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
27410 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
27420 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
27430 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
27440 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
27450 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
27460 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
27470 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20  lwr+upr)/2 */.  
27480 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27490 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
274a0 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e  +1 || (pPage->in
274b0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
274c0 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73  leaf) );.    ass
274d0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
274e0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
274f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
27500 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27510 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27520 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
27530 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
27540 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43  Cell );.      pC
27550 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27560 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
27570 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  x;.      *pRes =
27580 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
27590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
275a0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
275b0 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f  sh;.    }.moveto
275c0 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20  _next_layer:.   
275d0 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
275e0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
275f0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
27600 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
27610 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
27620 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
27630 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
27640 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
27650 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
27660 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
27670 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27680 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  e] = (u16)lwr;. 
27690 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
276a0 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
276b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
276c0 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74  break;.  }.movet
276d0 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72  o_finish:.  pCur
276e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
276f0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
27700 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
27710 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
27720 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e  dOvfl);.  return
27730 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
27740 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
27750 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
27760 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
27770 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
27780 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
27790 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
277a0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
277b0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
277c0 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
277d0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
277e0 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
277f0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
27800 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
27810 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
27820 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
27830 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
27840 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
27850 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
27860 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
27870 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
27880 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
27890 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
278a0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
278b0 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
278c0 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
278d0 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
278e0 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
278f0 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
27900 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
27910 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
27920 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
27930 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
27940 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
27950 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
27960 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
27970 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
27980 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
27990 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
279a0 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
279b0 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
279c0 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
279d0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
279e0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
279f0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
27a00 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
27a10 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
27a20 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
27a30 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
27a40 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
27a50 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
27a60 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
27a70 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
27a80 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
27a90 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
27aa0 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
27ab0 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
27ac0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
27ad0 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
27ae0 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
27af0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
27b00 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
27b10 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
27b20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
27b30 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
27b40 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
27b50 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
27b60 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
27b70 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
27b80 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
27b90 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
27ba0 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
27bb0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
27bc0 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
27bd0 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
27be0 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
27bf0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
27c00 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
27c10 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
27c20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
27c30 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
27c40 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
27c50 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
27c60 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
27c70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
27c80 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
27c90 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
27ca0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
27cb0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
27cc0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
27cd0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
27ce0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
27cf0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
27d00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
27d10 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
27d20 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
27d30 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
27d40 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
27d50 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
27d60 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
27d70 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
27d80 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 69 6e 76  VALID ){.    inv
27d90 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
27da0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
27db0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
27dc0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
27dd0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
27de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27df0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
27e00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
27e10 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
27e20 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
27e30 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
27e40 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
27e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27e60 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
27e70 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
27e80 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
27e90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
27ea0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
27eb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27ec0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
27ed0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
27ee0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
27ef0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
27f00 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
27f10 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
27f20 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
27f30 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
27f40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27f60 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
27f70 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
27f80 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
27f90 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
27fa0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
27fb0 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
27fc0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
27fd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27fe0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
27ff0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
28000 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
28010 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
28020 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
28030 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
28040 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
28050 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
28060 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
28070 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
28080 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
28090 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
280a0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
280b0 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
280c0 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
280d0 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
280e0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
280f0 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
28100 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
28110 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
28120 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
28130 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
28140 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
28150 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
28160 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66   );..  pCur->inf
28170 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
28180 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
28190 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
281a0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
281b0 29 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  );.  if( idx>=pP
281c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
281d0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
281e0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
281f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
28200 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
28210 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
28220 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
28230 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
28240 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
28250 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
28260 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28270 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
28280 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
28290 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
282a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
282b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
282c0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
282d0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
282e0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
282f0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
28300 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
28310 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
28320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
28340 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
28350 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
28360 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28370 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
28380 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
28390 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
283a0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
283b0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
283c0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
283d0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
283e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
283f0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
28400 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28410 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
28420 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
28430 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
28440 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
28450 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
28460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28470 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
28480 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
28490 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
284a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
284b0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
284c0 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
284d0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
284e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
284f0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
28500 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
28510 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
28520 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
28530 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
28540 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
28550 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
28560 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
28570 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
28580 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
28590 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
285a0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
285b0 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
285c0 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
285d0 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
285e0 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
285f0 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
28600 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
28610 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
28620 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
28630 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
28640 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
28650 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
28660 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
28670 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
28680 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
28690 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
286a0 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
286b0 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
286c0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
286d0 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
286e0 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
286f0 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
28700 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
28710 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
28720 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
28730 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
28740 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
28750 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
28760 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
28770 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
28780 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
28790 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
287a0 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
287b0 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 69 6e   however.).*/.in
287c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
287d0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
287e0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
287f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
28800 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
28810 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
28820 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
28830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
28840 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
28850 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
28860 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
28870 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
28880 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
28890 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
288a0 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e  ALID );.  pCur->
288b0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
288c0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
288d0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28  alidOvfl);.  if(
288e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
288f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
28900 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43     if( ALWAYS(pC
28910 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
28920 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 29 20  OR_REQUIRESEEK) 
28930 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ){.      rc = bt
28940 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
28950 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
28960 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28980 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
28990 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
289a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
289b0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
289c0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
289d0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
289e0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
289f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28a00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
28a10 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
28a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28a30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28a40 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
28a50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28a60 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
28a70 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28a80 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
28a90 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
28aa0 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
28ab0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
28ac0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
28ad0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
28ae0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28af0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
28b00 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
28b10 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
28b20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
28b30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28b40 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
28b50 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
28b60 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
28b70 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
28b80 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
28b90 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28ba0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
28bb0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
28bc0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
28bd0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
28be0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
28bf0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
28c00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28c10 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76    }.    rc = mov
28c20 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
28c30 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
28c40 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
28c50 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28c60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
28c70 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
28c80 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
28c90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
28ca0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
28cb0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
28cc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28cd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
28ce0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
28cf0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
28d00 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
28d10 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
28d20 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28d30 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
28d40 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
28d50 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
28d60 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
28d70 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
28d80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28d90 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
28da0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
28db0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
28dc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
28dd0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
28de0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
28df0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28e00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28e10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
28e20 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
28e30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
28e40 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
28e50 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28e60 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
28e70 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
28e80 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
28e90 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
28ea0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
28eb0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
28ec0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
28ed0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
28ee0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
28ef0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
28f00 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
28f10 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
28f20 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
28f30 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
28f40 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
28f50 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
28f60 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
28f70 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
28f80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
28f90 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
28fa0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
28fb0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
28fc0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
28fd0 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
28fe0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
28ff0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
29000 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
29010 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
29020 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
29030 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
29040 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
29050 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
29060 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
29070 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
29080 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
29090 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
290a0 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
290b0 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
290c0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
290d0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
290e0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
290f0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
29100 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
29110 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
29120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
29130 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
29140 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
29150 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
29160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
29170 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
29180 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
29190 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
291a0 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
291b0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
291c0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
291d0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
291e0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
291f0 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
29200 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
29210 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
29220 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
29230 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
29240 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
29250 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
29260 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
29270 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
29280 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
29290 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
292a0 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
292b0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
292c0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
292d0 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
292e0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
292f0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
29300 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
29310 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
29320 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
29330 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
29340 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
29350 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
29360 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
29370 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
29380 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
29390 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
293a0 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
293b0 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
293c0 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
293d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
293e0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
293f0 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
29400 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
29410 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
29420 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
29430 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
29440 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
29450 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
29460 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
29470 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
29480 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
29490 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
294a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
294b0 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
294c0 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
294d0 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
294e0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
294f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
29500 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
29510 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29520 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
29530 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
29540 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
29550 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
29560 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
29570 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
29580 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
29590 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
295a0 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
295b0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
295c0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
295d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
295e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
295f0 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
29600 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
29610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29620 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29630 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
29640 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
29650 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
29660 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
29670 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
29680 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
29690 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
296a0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
296b0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
296c0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
296d0 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
296e0 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
296f0 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
29700 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
29710 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
29720 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
29730 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
29740 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
29750 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
29760 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
29770 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
29780 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
29790 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
297a0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
297b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
297c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
297d0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
297e0 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
297f0 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
29800 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
29810 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
29820 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
29830 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
29840 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
29850 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
29860 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
29870 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
29880 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
29890 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
298a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
298b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
298c0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
298d0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
298e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
298f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
29900 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
29910 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
29920 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
29930 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
29940 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
29950 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
29960 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
29970 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
29980 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
29990 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
299a0 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
299b0 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
299c0 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
299d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
299e0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
299f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
29a00 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
29a10 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
29a20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
29a30 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
29a40 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
29a50 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
29a60 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
29a70 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
29a80 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
29a90 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
29aa0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
29ab0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
29ac0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
29ad0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
29ae0 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
29af0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
29b00 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
29b10 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
29b20 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
29b30 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
29b40 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
29b50 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
29b60 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
29b70 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
29b80 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
29b90 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
29ba0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
29bb0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
29bc0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
29bd0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
29be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
29bf0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
29c00 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
29c10 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
29c20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
29c30 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
29c40 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
29c50 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
29c60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
29c70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
29c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29c90 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
29ca0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
29cb0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
29cc0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
29cd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
29ce0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
29cf0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
29d00 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
29d10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29d20 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20  Trunk!=0 );.    
29d30 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
29d40 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20  ->aData!=0 );.. 
29d50 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
29d60 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
29d70 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65  [4]); /* # of le
29d80 61 76 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75  aves on this tru
29d90 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  nk page */.     
29da0 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
29db0 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
29dc0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
29dd0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
29de0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
29df0 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
29e00 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
29e10 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
29e20 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
29e30 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
29e40 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
29e50 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
29e60 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
29e70 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
29e80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
29e90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29ea0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
29eb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29ec0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
29ed0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
29ee0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
29ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
29f00 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
29f10 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
29f20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
29f30 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
29f40 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
29f50 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
29f60 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
29f70 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
29f80 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
29f90 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
29fa0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
29fb0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
29fc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
29fd0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
29fe0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
29ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
2a000 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
2a010 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
2a020 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
2a030 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2a040 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2a050 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
2a060 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2a070 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
2a080 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2a090 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
2a0a0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a  if( searchList .
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2a0c0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c  nearby==iTrunk |
2a0d0 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79  | (iTrunk<nearby
2a0e0 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
2a0f0 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29  OC_LE)) .      )
2a100 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2a110 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
2a120 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
2a130 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
2a140 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
2a150 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
2a160 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2a170 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
2a180 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
2a190 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2a1a0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2a1b0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
2a1c0 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
2a1d0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2a1e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a1f0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2a200 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2a210 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2a220 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2a230 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a250 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
2a260 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2a270 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2a280 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2a290 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2a2a0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2a2b0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2a2c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a2d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a2e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
2a2f0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
2a300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2a310 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a330 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2a340 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a360 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
2a370 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2a380 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2a390 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2a3a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2a3b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2a3c0 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
2a3d0 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
2a3e0 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
2a3f0 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
2a400 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
2a410 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
2a420 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
2a430 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
2a440 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
2a450 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
2a460 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
2a470 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
2a480 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
2a490 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
2a4a0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
2a4b0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2a4c0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
2a4d0 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
2a4e0 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
2a4f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a500 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2a510 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2a520 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2a530 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2a540 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2a550 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
2a560 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2a570 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2a580 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
2a590 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
2a5a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2a5b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a5c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2a5d0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2a5e0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2a5f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
2a600 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a610 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
2a620 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2a630 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a650 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2a660 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2a670 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2a680 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2a690 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a6a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2a6b0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2a6c0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
2a6d0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2a6e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2a6f0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2a700 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2a710 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
2a720 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
2a730 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2a740 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
2a750 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2a760 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2a770 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a780 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2a790 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2a7a0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2a7b0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2a7c0 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
2a7d0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2a7e0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2a7f0 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
2a800 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
2a810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2a820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a830 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
2a840 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2a850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2a860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a870 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2a880 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a8a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2a8b0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2a8c0 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
2a8d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
2a8f0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2a900 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2a910 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
2a920 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
2a930 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
2a940 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
2a950 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
2a960 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
2a970 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
2a980 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
2a990 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
2a9a0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
2a9b0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2a9c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
2a9d0 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
2a9e0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
2a9f0 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
2aa00 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
2aa10 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2aa20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2aa30 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2aa40 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
2aa50 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2aa60 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
2aa70 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
2aa80 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
2aa90 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
2aaa0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
2aab0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
2aac0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
2aad0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
2aae0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2ab00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ab10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2ab20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
2ab30 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
2ab40 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
2ab50 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2ab60 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
2ab70 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
2ab80 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
2ab90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2aba0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
2abb0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
2abc0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
2abd0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2abf0 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
2ac10 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
2ac20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2ac30 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
2ac40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ac50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2ac60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2ac70 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2ac80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
2ac90 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
2aca0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2acb0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
2acc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2acd0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
2ace0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
2acf0 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
2ad00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ad10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2ad20 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2ad30 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2ad40 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2ad50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ad60 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
2ad70 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
2ad80 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2ad90 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
2ada0 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
2adb0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
2adc0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
2add0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2ade0 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
2adf0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
2ae00 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
2ae10 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2ae20 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
2ae30 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
2ae40 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
2ae50 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
2ae60 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
2ae70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2ae80 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
2ae90 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
2aea0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
2aeb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2aec0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2aed0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2aee0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2aef0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2af00 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2af10 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
2af20 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
2af30 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2af40 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2af50 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
2af60 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2af70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
2af80 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
2af90 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2afa0 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
2afb0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
2afc0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 3f 20  (pBt, *pPgno) ? 
2afd0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
2afe0 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
2aff0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2b000 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
2b010 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
2b020 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
2b030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b040 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2b050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b060 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
2b070 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
2b080 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2b090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
2b0b0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
2b0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2b0d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b0e0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2b0f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2b100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2b110 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
2b120 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
2b130 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
2b140 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
2b150 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
2b160 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2b170 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
2b180 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
2b190 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
2b1a0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
2b1b0 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
2b1c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
2b1d0 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
2b1e0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
2b1f0 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
2b200 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
2b210 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
2b220 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
2b230 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
2b240 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
2b250 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
2b260 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
2b270 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
2b280 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
2b290 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
2b2a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
2b2b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2b2c0 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
2b2d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
2b2e0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
2b2f0 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
2b300 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
2b310 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
2b320 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
2b330 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
2b340 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
2b350 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
2b360 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
2b370 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
2b380 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
2b390 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
2b3a0 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
2b3b0 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
2b3c0 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
2b3d0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
2b3e0 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
2b3f0 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
2b400 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b410 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
2b420 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
2b430 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
2b440 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
2b450 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
2b460 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
2b470 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
2b480 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
2b490 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
2b4a0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
2b4b0 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
2b4c0 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
2b4d0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2b4e0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
2b4f0 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
2b500 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
2b510 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
2b520 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
2b530 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2b540 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
2b550 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
2b560 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
2b570 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
2b580 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
2b590 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
2b5a0 6f 54 72 75 6e 63 61 74 65 29 29 20 3f 20 50 41  oTruncate)) ? PA
2b5b0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
2b5c0 54 20 3a 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d  T : 0;..    rc =
2b5d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b5e0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
2b5f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2b600 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2b610 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
2b620 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
2b630 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
2b640 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2b650 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
2b660 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b670 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2b680 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2b690 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
2b6a0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
2b6b0 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
2b6c0 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
2b6d0 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
2b6e0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
2b6f0 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
2b700 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
2b710 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
2b720 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
2b730 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
2b740 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
2b750 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
2b760 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
2b770 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
2b780 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
2b790 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
2b7a0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
2b7b0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
2b7c0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2b7d0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2b7e0 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
2b7f0 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
2b800 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
2b810 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
2b820 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
2b830 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2b840 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2b850 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  tPage(pBt, pBt->
2b860 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
2b870 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
2b880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2b8a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b8b0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
2b8c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2b8d0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
2b8e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2b8f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b900 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
2b910 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
2b920 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
2b930 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2b940 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
2b950 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2b960 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
2b970 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
2b980 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
2b990 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
2b9a0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
2b9b0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
2b9c0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2b9d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2b9e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2b9f0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
2ba00 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
2ba10 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
2ba20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2ba30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ba40 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2ba50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2ba60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ba70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2ba80 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2ba90 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
2baa0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2bab0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2bac0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
2bad0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
2bae0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2baf0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2bb00 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
2bb10 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
2bb20 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2bb30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2bb40 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
2bb50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bb60 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2bb70 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2bb80 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
2bb90 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
2bba0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2bbb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
2bbc0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
2bbd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2bbe0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2bbf0 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
2bc00 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
2bc10 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
2bc20 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
2bc30 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2bc40 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
2bc50 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a  erIswriteable((*
2bc60 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2bc70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
2bc80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2bc90 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2bca0 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
2bcb0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
2bcc0 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
2bcd0 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
2bce0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
2bcf0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
2bd00 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
2bd10 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
2bd20 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
2bd30 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2bd40 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2bd50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
2bd60 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
2bd70 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
2bd80 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
2bd90 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
2bda0 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
2bdb0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
2bdc0 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
2bdd0 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
2bde0 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
2bdf0 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
2be00 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
2be10 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
2be20 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
2be30 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
2be40 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2be50 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
2be60 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
2be70 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
2be80 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2be90 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2bea0 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
2beb0 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
2bec0 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
2bed0 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
2bee0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
2bef0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2bf00 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
2bf10 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
2bf20 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf40 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2bf50 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
2bf60 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
2bf70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
2bf80 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
2bf90 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
2bfa0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2bfb0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2bfc0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2bfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2bfe0 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
2bff0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
2c000 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c020 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2c030 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
2c040 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
2c050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c060 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2c070 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
2c080 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
2c090 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2c0a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2c0b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
2c0c0 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
2c0d0 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
2c0e0 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
2c0f0 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
2c100 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
2c110 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
2c120 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
2c130 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
2c140 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
2c150 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
2c160 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2c170 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
2c180 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2c190 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
2c1a0 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
2c1b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c1c0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2c1d0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2c1e0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2c1f0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
2c200 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2c210 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2c220 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2c230 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2c240 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
2c250 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2c260 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
2c270 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
2c280 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
2c290 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2c2a0 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
2c2b0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
2c2c0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
2c2d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
2c2e0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
2c2f0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
2c300 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
2c310 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
2c320 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
2c330 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
2c340 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
2c350 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2c360 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2c370 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
2c380 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2c390 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
2c3a0 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
2c3b0 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
2c3c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
2c3d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2c3e0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2c3f0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
2c400 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
2c410 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2c420 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2c430 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2c440 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
2c450 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2c460 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
2c470 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
2c480 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
2c490 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
2c4a0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2c4b0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2c4c0 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
2c4d0 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
2c4e0 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
2c4f0 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
2c500 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
2c510 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
2c520 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
2c530 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
2c540 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
2c550 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
2c560 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2c570 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
2c580 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2c590 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
2c5a0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2c5b0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
2c5c0 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
2c5d0 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
2c5e0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
2c5f0 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
2c600 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
2c610 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
2c620 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
2c630 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
2c640 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
2c650 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
2c660 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
2c670 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
2c680 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2c690 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
2c6a0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
2c6b0 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
2c6c0 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
2c6d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2c6e0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2c6f0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2c700 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
2c710 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
2c720 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2c740 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2c750 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
2c760 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
2c770 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2c780 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
2c790 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
2c7a0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
2c7b0 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
2c7c0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
2c7d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2c7e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2c7f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
2c800 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2c810 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
2c820 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
2c830 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
2c840 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
2c850 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
2c860 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
2c870 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
2c880 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
2c890 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
2c8a0 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
2c8b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
2c8c0 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
2c8d0 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
2c8e0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
2c8f0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
2c900 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2c910 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
2c920 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
2c930 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
2c940 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
2c950 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
2c960 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
2c970 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
2c980 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
2c990 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
2c9a0 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
2c9b0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2c9c0 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
2c9d0 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
2c9e0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2c9f0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
2ca00 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
2ca10 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
2ca20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
2ca30 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
2ca40 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
2ca50 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
2ca60 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
2ca70 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
2ca80 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
2ca90 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2caa0 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
2cab0 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
2cac0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
2cad0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
2cae0 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
2caf0 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
2cb00 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
2cb10 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
2cb20 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
2cb30 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
2cb40 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
2cb50 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
2cb60 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
2cb70 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
2cb80 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
2cb90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2cba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2cbb0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2cbc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2cbd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2cbe0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
2cbf0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2cc00 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
2cc10 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
2cc20 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2cc30 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
2cc40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2cc50 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
2cc60 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
2cc70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
2cc80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2cc90 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2cca0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2ccb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
2ccc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
2ccd0 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
2cce0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
2ccf0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
2cd00 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2cd10 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
2cd20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
2cd30 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
2cd40 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
2cd50 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2cd60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2cd70 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
2cd80 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
2cd90 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
2cda0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2cdb0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
2cdc0 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
2cdd0 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
2cde0 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
2cdf0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2ce00 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
2ce10 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
2ce20 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
2ce30 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
2ce40 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
2ce50 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2ce60 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
2ce70 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
2ce80 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
2ce90 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
2cea0 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
2ceb0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
2cec0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
2ced0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
2cee0 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
2cef0 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
2cf00 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
2cf10 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
2cf20 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
2cf30 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
2cf40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2cf50 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2cf60 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
2cf70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cf80 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2cf90 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
2cfa0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
2cfb0 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
2cfc0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2cfd0 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
2cfe0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2cff0 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
2d000 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
2d010 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
2d020 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
2d030 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
2d040 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
2d050 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
2d060 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
2d070 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
2d080 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
2d090 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2d0a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2d0b0 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
2d0c0 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
2d0d0 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
2d0e0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
2d0f0 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
2d100 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
2d110 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
2d120 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
2d130 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
2d140 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
2d150 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
2d160 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
2d170 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2d180 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73  given Cell..*/.s
2d190 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
2d1a0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
2d1b0 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ge, unsigned cha
2d1c0 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53  r *pCell){.  BtS
2d1d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2d1e0 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
2d1f0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
2d200 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
2d210 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
2d220 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
2d230 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
2d240 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d250 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2d260 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65  mutex) );.  btre
2d270 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2d280 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
2d290 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  o);.  if( info.i
2d2a0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
2d2b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d2c0 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
2d2d0 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
2d2e0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
2d2f0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
2d300 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
2d310 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
2d320 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
2d330 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
2d340 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d350 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
2d360 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
2d370 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
2d380 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
2d390 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
2d3a0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
2d3b0 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
2d3c0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
2d3d0 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
2d3e0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
2d3f0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
2d400 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
2d410 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
2d420 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
2d430 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
2d440 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
2d450 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
2d460 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
2d470 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
2d480 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
2d490 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
2d4a0 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
2d4b0 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
2d4c0 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
2d4d0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
2d4e0 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
2d4f0 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
2d500 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
2d510 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
2d520 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
2d530 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
2d540 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
2d550 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
2d560 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
2d570 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
2d580 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2d590 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
2d5a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2d5b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2d5c0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
2d5d0 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
2d5e0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
2d5f0 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
2d600 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
2d610 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d620 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
2d630 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
2d640 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
2d650 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
2d660 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
2d670 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
2d680 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
2d690 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
2d6a0 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
2d6b0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
2d6c0 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
2d6d0 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
2d6e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2d6f0 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
2d700 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2d710 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
2d720 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
2d730 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
2d740 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
2d750 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
2d760 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
2d770 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
2d780 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
2d790 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
2d7a0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
2d7b0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
2d7c0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
2d7d0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
2d7e0 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
2d7f0 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
2d800 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
2d810 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
2d820 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
2d830 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
2d840 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
2d850 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
2d860 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
2d870 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
2d880 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
2d890 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
2d8a0 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
2d8b0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
2d8c0 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
2d8d0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
2d8e0 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
2d8f0 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
2d900 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
2d910 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
2d920 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2d930 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d940 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
2d950 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
2d960 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
2d970 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
2d980 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
2d990 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
2d9a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
2d9b0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
2d9c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
2d9d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d9e0 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
2d9f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2da00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2da10 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
2da20 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
2da30 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
2da40 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
2da50 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
2da60 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
2da70 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
2da80 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
2da90 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
2daa0 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
2dab0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
2dac0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
2dad0 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
2dae0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
2daf0 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
2db00 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
2db10 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
2db20 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
2db30 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
2db40 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
2db50 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
2db60 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
2db70 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
2db80 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
2db90 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
2dba0 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
2dbb0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
2dbc0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
2dbd0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
2dbe0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
2dbf0 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
2dc00 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
2dc10 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
2dc20 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
2dc30 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
2dc40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2dc50 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
2dc60 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
2dc70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2dc80 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
2dc90 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
2dca0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
2dcb0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
2dcc0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
2dcd0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
2dce0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
2dcf0 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
2dd00 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
2dd10 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dd30 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
2dd40 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
2dd50 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
2dd60 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
2dd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2dd80 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
2dd90 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
2dda0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
2ddb0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
2ddc0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
2ddd0 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
2dde0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
2ddf0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
2de00 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
2de10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2de20 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
2de30 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
2de40 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
2de50 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2de60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
2de70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
2de80 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
2de90 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
2dea0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2deb0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2dec0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2ded0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
2dee0 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
2def0 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
2df00 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
2df10 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
2df20 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
2df30 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
2df40 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
2df50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
2df60 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
2df70 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
2df80 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2df90 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2dfa0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2dfb0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2dfc0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2dfd0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2dfe0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
2dff0 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
2e000 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2e010 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
2e020 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
2e030 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
2e040 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2e050 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
2e060 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
2e070 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
2e080 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
2e090 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
2e0a0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2e0b0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2e0c0 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
2e0d0 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72  Key);.  btreePar
2e0e0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2e0f0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2e100 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
2e110 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
2e120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2e130 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
2e140 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
2e150 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
2e160 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
2e170 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2e180 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
2e190 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
2e1a0 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
2e1b0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2e1c0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
2e1d0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2e1e0 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
2e1f0 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
2e200 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78  f( NEVER(nKey>0x
2e210 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
2e220 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ==0) ){.      re
2e230 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2e240 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2e250 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
2e260 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70  (int)nKey;.    p
2e270 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
2e280 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79  nSrc = (int)nKey
2e290 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20  ;.  }.  *pnSize 
2e2a0 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
2e2b0 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f  spaceLeft = info
2e2c0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c  .nLocal;.  pPayl
2e2d0 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
2e2e0 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20  ader];.  pPrior 
2e2f0 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
2e300 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69  verflow];..  whi
2e310 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
2e320 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
2e330 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
2e340 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2e350 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
2e360 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
2e370 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
2e380 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
2e390 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
2e3a0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
2e3b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2e3c0 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
2e3d0 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
2e3e0 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
2e3f0 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
2e400 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2e410 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
2e420 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
2e430 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2e440 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
2e450 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2e460 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2e470 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2e480 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
2e490 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
2e4a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e4b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e4c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
2e4d0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2e4e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
2e4f0 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
2e500 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
2e510 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
2e520 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
2e530 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
2e540 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
2e550 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
2e560 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
2e570 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
2e580 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
2e590 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
2e5a0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
2e5b0 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
2e5c0 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
2e5d0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2e5e0 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
2e5f0 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
2e600 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
2e610 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
2e620 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
2e630 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
2e640 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
2e650 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
2e660 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
2e670 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  the uninitialize
2e680 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
2e690 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
2e6a0 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
2e6b0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
2e6c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2e6d0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2e6e0 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
2e6f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
2e700 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
2e710 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
2e720 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
2e730 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
2e740 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2e750 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
2e760 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
2e770 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
2e780 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2e790 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
2e7a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
2e7b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2e7c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e7d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e7e0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2e7f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2e800 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2e810 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
2e820 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
2e830 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
2e840 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
2e850 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
2e860 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
2e870 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
2e880 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2e890 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
2e8a0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2e8b0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2e8c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2e8d0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2e8e0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
2e8f0 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
2e900 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2e910 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2e920 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2e930 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
2e940 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2e950 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2e960 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
2e970 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
2e980 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2e990 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2e9a0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2e9b0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2e9c0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2e9d0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
2e9e0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
2e9f0 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
2ea00 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2ea10 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
2ea20 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
2ea30 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
2ea40 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
2ea50 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
2ea60 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
2ea70 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
2ea80 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
2ea90 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
2eaa0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2eab0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
2eac0 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
2ead0 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
2eae0 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
2eaf0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
2eb00 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
2eb10 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
2eb20 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
2eb30 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
2eb40 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
2eb50 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
2eb60 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
2eb70 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
2eb80 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
2eb90 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
2eba0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ebb0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
2ebc0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2ebd0 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
2ebe0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
2ebf0 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
2ec00 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
2ec10 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
2ec20 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2ec30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2ec40 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
2ec50 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
2ec60 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
2ec70 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2ec80 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2ec90 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2eca0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2ecb0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
2ecc0 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
2ecd0 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
2ece0 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
2ecf0 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
2ed00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
2ed10 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
2ed20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ed30 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
2ed40 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
2ed50 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
2ed60 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
2ed70 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
2ed80 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
2ed90 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
2eda0 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
2edb0 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
2edc0 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
2edd0 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
2ede0 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
2edf0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2ee00 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
2ee10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2ee20 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2ee30 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
2ee40 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
2ee50 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
2ee60 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
2ee70 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
2ee80 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
2ee90 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
2eea0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
2eeb0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2eec0 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
2eed0 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
2eee0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
2eef0 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
2ef00 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
2ef10 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
2ef20 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
2ef30 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
2ef40 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
2ef50 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
2ef60 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
2ef70 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2ef80 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
2ef90 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
2efa0 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
2efb0 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
2efc0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
2efd0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
2efe0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2eff0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
2f000 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
2f010 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
2f020 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
2f030 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
2f040 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
2f050 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f060 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
2f070 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
2f080 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
2f090 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
2f0a0 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
2f0b0 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
2f0c0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
2f0d0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
2f0e0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
2f0f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
2f100 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2f110 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
2f120 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f130 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f140 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2f150 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2f160 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2f170 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2f180 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
2f190 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2f1a0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
2f1b0 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
2f1c0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
2f1d0 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
2f1e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2f1f0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
2f200 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2f210 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
2f220 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
2f230 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2f240 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
2f250 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
2f260 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
2f270 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
2f280 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2f290 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
2f2a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f2b0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
2f2c0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
2f2d0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
2f2e0 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
2f2f0 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2f300 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2f310 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
2f320 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20  .  memmove(ptr, 
2f330 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d  ptr+2, 2*(pPage-
2f340 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a  >nCell - idx));.
2f350 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2f360 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
2f370 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
2f380 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a  >nFree += 2;.}..
2f390 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2f3a0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
2f3b0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
2f3c0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
2f3d0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
2f3e0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
2f3f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
2f400 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
2f410 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
2f420 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
2f430 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
2f440 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
2f450 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2f460 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2f470 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
2f480 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
2f490 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
2f4a0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
2f4b0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
2f4c0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f  ** in pPage->apO
2f4d0 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
2f4e0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
2f4f0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
2f500 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
2f510 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
2f520 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
2f530 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
2f540 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
2f550 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
2f560 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
2f570 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
2f580 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2f590 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
2f5a0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
2f5b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2f5c0 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
2f5d0 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
2f5e0 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
2f5f0 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
2f600 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
2f610 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
2f620 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
2f630 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
2f640 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
2f650 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
2f660 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
2f670 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2f680 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
2f690 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
2f6a0 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
2f6b0 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
2f6c0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2f6d0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
2f6e0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
2f6f0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
2f700 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
2f710 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
2f720 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
2f730 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
2f740 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
2f750 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
2f760 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
2f770 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
2f780 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2f790 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
2f7a0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
2f7b0 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
2f7c0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
2f7d0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
2f7e0 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
2f7f0 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49  Child,      /* I
2f800 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
2f810 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
2f820 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
2f830 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20  e */.  int *pRC 
2f840 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2f850 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72   and write retur
2f860 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65  n code from here
2f870 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
2f880 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
2f890 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
2f8a0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
2f8b0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2f8c0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
2f8d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2f8e0 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
2f8f0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
2f900 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
2f910 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2f920 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2f930 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
2f940 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
2f950 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
2f960 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
2f970 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  erted */.  int c
2f980 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
2f990 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
2f9a0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2f9b0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2f9c0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
2f9d0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
2f9e0 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
2f9f0 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d  */.  int nSkip =
2fa00 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30   (iChild ? 4 : 0
2fa10 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  );..  if( *pRC )
2fa20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
2fa30 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
2fa40 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
2fa50 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
2fa60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2fa70 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
2fa80 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
2fa90 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2faa0 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
2fab0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2fac0 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
2fad0 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
2fae0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41  ) );.  assert( A
2faf0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2fb00 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69  apOvfl)==ArraySi
2fb10 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  ze(pPage->aiOvfl
2fb20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2fb30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2fb40 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2fb50 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2fb60 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
2fb70 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
2fb80 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
2fb90 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
2fba0 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
2fbb0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2fbc0 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
2fbd0 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
2fbe0 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
2fbf0 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
2fc00 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
2fc10 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
2fc20 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
2fc30 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
2fc40 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
2fc50 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
2fc60 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
2fc70 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
2fc80 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
2fc90 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
2fca0 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
2fcb0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
2fcc0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2fcd0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2fce0 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
2fcf0 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
2fd00 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2fd10 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2fd20 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2fd30 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2fd40 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2fd50 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2fd60 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2fd70 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2fd80 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2fd90 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2fda0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2fdb0 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2fdc0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
2fdd0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
2fde0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2fdf0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
2fe00 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
2fe10 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
2fe20 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
2fe30 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
2fe40 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
2fe50 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
2fe60 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  16)i;.  }else{. 
2fe70 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
2fe80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2fe90 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2fea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2feb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
2fec0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
2fed0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2fee0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2fef0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2ff00 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2ff10 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
2ff20 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
2ff30 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
2ff40 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
2ff50 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
2ff60 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
2ff70 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20  >nCell;.    ins 
2ff80 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2ff90 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  *i;.    rc = all
2ffa0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
2ffb0 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
2ffc0 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
2ffd0 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
2ffe0 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
2fff0 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
30000 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
30010 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
30020 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
30030 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
30040 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61  success */.    a
30050 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e  ssert( idx >= en
30060 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d+2 );.    asser
30070 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e  t( idx+sz <= (in
30080 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
30090 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
300a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
300b0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
300c0 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
300d0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
300e0 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
300f0 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
30100 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20  nSkip);.    if( 
30110 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
30120 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69  put4byte(&data[i
30130 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  dx], iChild);.  
30140 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28    }.    memmove(
30150 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c 20 26 64  &data[ins+2], &d
30160 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e  ata[ins], end-in
30170 73 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  s);.    put2byte
30180 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
30190 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
301a0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
301b0 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
301c0 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  ->nCell);.#ifnde
301d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
301e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
301f0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
30200 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
30210 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
30220 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
30230 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
30240 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
30250 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
30260 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
30270 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
30280 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
30290 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
302a0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
302b0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
302c0 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
302d0 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
302e0 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
302f0 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
30300 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
30310 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
30320 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
30330 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
30340 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
30350 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
30360 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
30370 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
30380 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
30390 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
303a0 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
303b0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
303c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
303d0 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
303e0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
303f0 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
30400 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
30410 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
30420 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
30430 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
30440 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
30450 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
30460 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
30470 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
30480 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
30490 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
304a0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
304b0 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
304c0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
304d0 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
304e0 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
304f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
30500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
30510 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
30520 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
30530 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
30540 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
30550 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
30560 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
30570 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
30580 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
30590 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
305a0 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
305b0 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
305c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
305d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
305e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
305f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30600 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
30610 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
30620 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
30630 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28  l<=(int)MX_CELL(
30640 70 50 61 67 65 2d 3e 70 42 74 29 0a 20 20 20 20  pPage->pBt).    
30650 20 20 20 20 20 20 20 20 26 26 20 28 69 6e 74 29          && (int)
30660 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
30670 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61  Bt)<=10921);.  a
30680 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
30690 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
306a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
306b0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
306c0 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  at the page has 
306d0 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64  just been zeroed
306e0 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a   by zeroPage() *
306f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
30700 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
30710 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
30720 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
30730 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
30740 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
30750 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
30760 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  x[nCell*2];.  ce
30770 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
30780 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
30790 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
307a0 20 20 20 75 31 36 20 73 7a 20 3d 20 61 53 69 7a     u16 sz = aSiz
307b0 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70  e[i];.    pCellp
307c0 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c  tr -= 2;.    cel
307d0 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20  lbody -= sz;.   
307e0 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
307f0 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  tr, cellbody);. 
30800 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
30810 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
30820 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20  l[i], sz);.  }. 
30830 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
30840 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
30850 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
30860 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
30870 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
30880 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
30890 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
308a0 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
308b0 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
308c0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
308d0 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
308e0 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
308f0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
30900 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
30910 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
30920 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
30930 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
30940 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
30950 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
30960 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
30970 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
30980 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
30990 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
309a0 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
309b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
309c0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
309d0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
309e0 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
309f0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
30a00 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
30a10 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
30a20 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
30a30 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
30a40 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
30a50 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
30a60 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
30a70 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
30a80 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
30a90 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
30aa0 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
30ab0 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
30ac0 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
30ad0 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
30ae0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
30af0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
30b00 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
30b10 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
30b20 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
30b30 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
30b40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30b50 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
30b60 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
30b70 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
30b80 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
30b90 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
30ba0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
30bb0 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
30bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
30bd0 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
30be0 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
30bf0 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
30c00 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
30c10 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
30c20 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
30c30 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
30c40 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
30c50 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
30c60 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
30c70 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
30c80 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
30c90 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
30ca0 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
30cb0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
30cc0 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
30cd0 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20  ying to balance 
30ce0 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
30cf0 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
30d00 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
30d10 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
30d20 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
30d30 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
30d40 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
30d50 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
30d60 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
30d70 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
30d80 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
30d90 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
30da0 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
30db0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
30dc0 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
30dd0 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
30de0 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
30df0 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
30e00 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
30e10 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
30e20 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
30e30 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
30e40 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
30e50 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
30e60 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
30e70 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
30e80 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
30e90 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
30ea0 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
30eb0 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
30ec0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
30ed0 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
30ee0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53  ge..**.** The pS
30ef0 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75  pace buffer is u
30f00 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74  sed to store a t
30f10 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66  emporary copy of
30f20 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20   the divider.** 
30f30 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62  cell that will b
30f40 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
30f50 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20  pParent. Such a 
30f60 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
30f70 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67   a 4.** byte pag
30f80 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65  e number followe
30f90 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20  d by a variable 
30fa0 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20  length integer. 
30fb0 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
30fc0 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79  s, at most 13 by
30fd0 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70  tes. Hence the p
30fe0 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73  Space buffer mus
30ff0 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74  t be at.** least
31000 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
31010 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
31020 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
31030 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
31040 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
31050 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20   u8 *pSpace){.  
31060 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20  BtShared *const 
31070 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
31080 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44  ;    /* B-Tree D
31090 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d  atabase */.  Mem
310a0 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Page *pNew;     
310b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310c0 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
310d0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ated page */.  i
310e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
310f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31100 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
31110 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  de */.  Pgno pgn
31120 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  oNew;           
31130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31140 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  Page number of p
31150 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  New */..  assert
31160 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
31170 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
31180 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
31190 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
311a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
311b0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
311c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
311d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
311e0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72  );..  /* This er
311f0 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ror condition is
31200 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
31210 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
31220 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
31230 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
31240 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
31250 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31260 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
31270 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
31280 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
31290 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
312a0 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
312b0 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
312c0 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
312d0 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
312e0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
312f0 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
31300 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
31310 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
31320 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
31330 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
31340 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
31350 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
31360 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
31370 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
31380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
31390 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
313a0 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
313b0 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
313c0 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75  apOvfl[0];.    u
313d0 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
313e0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
313f0 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
31400 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
31410 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
31420 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
31430 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
31440 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
31450 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
31460 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
31470 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
31480 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
31490 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
314a0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
314b0 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
314c0 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
314d0 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
314e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
314f0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
31500 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
31510 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
31520 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
31530 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
31540 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
31550 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
31560 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
31570 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
31580 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
31590 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
315a0 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
315b0 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
315c0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
315d0 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
315e0 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
315f0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31600 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
31610 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
31620 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
31630 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
31640 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
31650 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
31660 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
31670 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
31680 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
31690 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
316a0 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
316b0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
316c0 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
316d0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
316e0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
316f0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
31700 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
31710 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
31720 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
31730 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
31740 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
31750 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
31760 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
31770 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
31780 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
31790 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
317a0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
317b0 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
317c0 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
317d0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
317e0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
317f0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
31800 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
31810 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
31820 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
31830 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
31840 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
31850 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
31860 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
31870 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
31880 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
31890 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
318a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
318b0 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
318c0 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
318d0 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
318e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
318f0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
31900 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
31910 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
31920 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
31930 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
31940 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
31950 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
31960 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
31970 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
31980 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
31990 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
319a0 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
319b0 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
319c0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
319d0 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
319e0 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
319f0 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
31a00 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
31a10 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
31a20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
31a30 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
31a40 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
31a50 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
31a60 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
31a70 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
31a80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
31a90 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
31aa0 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
31ab0 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
31ac0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
31ad0 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
31ae0 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
31af0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
31b00 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
31b10 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
31b20 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
31b30 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
31b40 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
31b50 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
31b60 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
31b70 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
31b80 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
31b90 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
31ba0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
31bb0 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
31bc0 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
31bd0 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
31be0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
31bf0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
31c00 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
31c10 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
31c20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
31c30 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
31c40 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
31c50 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
31c60 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
31c70 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
31c80 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
31c90 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
31ca0 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
31cb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
31cc0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
31cd0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
31ce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
31cf0 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
31d00 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
31d10 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
31d20 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
31d30 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
31d40 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
31d50 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
31d60 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
31d70 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
31d80 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
31d90 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
31da0 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
31db0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
31dc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
31dd0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
31de0 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
31df0 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
31e00 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
31e10 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
31e20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
31e30 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
31e40 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
31e50 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
31e60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
31e70 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
31e80 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
31e90 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
31ea0 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
31eb0 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
31ec0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
31ed0 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
31ee0 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
31ef0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
31f00 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
31f10 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
31f20 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
31f30 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
31f40 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
31f50 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
31f60 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
31f70 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
31f80 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
31f90 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
31fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
31fb0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
31fc0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
31fd0 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
31fe0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
31ff0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
32000 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
32010 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
32020 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
32030 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
32040 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
32050 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
32060 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
32070 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
32080 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
32090 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
320a0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
320b0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
320c0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
320d0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
320e0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
320f0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
32100 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32110 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
32120 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
32130 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
32140 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
32150 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
32160 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
32170 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
32180 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
32190 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
321a0 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
321b0 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
321c0 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
321d0 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
321e0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
321f0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
32200 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
32210 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
32220 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
32230 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
32240 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
32250 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
32260 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
32270 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
32280 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
32290 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
322a0 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
322b0 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
322c0 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
322d0 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
322e0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
322f0 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
32300 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
32310 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
32320 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
32330 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
32340 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
32350 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d  MemPage.apOvfl[]
32360 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
32370 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
32380 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
32390 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
323a0 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
323b0 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
323c0 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
323d0 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
323e0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
323f0 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
32400 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
32410 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
32420 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
32430 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
32440 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
32450 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
32460 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
32470 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
32480 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
32490 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
324a0 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43  c void copyNodeC
324b0 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
324c0 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
324d0 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  pTo, int *pRC){.
324e0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
324f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42  LITE_OK ){.    B
32500 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
32510 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
32520 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
32530 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
32540 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20  aData;.    u8 * 
32550 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
32560 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  >aData;.    int 
32570 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
32580 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
32590 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  t;.    int const
325a0 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
325b0 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
325c0 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  : 0);.    int rc
325d0 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b  ;.    int iData;
325e0 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72  .  .  .    asser
325f0 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74  t( pFrom->isInit
32600 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32610 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54  pFrom->nFree>=iT
32620 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  oHdr );.    asse
32630 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
32640 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
32650 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
32660 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
32670 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
32680 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
32690 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
326a0 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
326b0 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
326c0 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
326d0 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
326e0 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
326f0 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
32700 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
32710 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
32720 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
32730 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
32740 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
32750 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
32760 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
32770 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
32780 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
32790 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
327a0 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
327b0 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
327c0 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
327d0 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
327e0 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63  ization of pTo c
327f0 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c  an actually fail
32800 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61   under.    ** fa
32810 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72  irly obscure cir
32820 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e  cumstances, even
32830 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20   though it is a 
32840 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69  copy of initiali
32850 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  zed .    ** page
32860 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20   pFrom..    */. 
32870 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
32880 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   0;.    rc = btr
32890 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b  eeInitPage(pTo);
328a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
328b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
328c0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
328d0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
328e0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
328f0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
32900 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
32910 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
32920 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
32930 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
32940 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
32950 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
32960 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
32970 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
32980 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
32990 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
329a0 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
329b0 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
329c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
329d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
329e0 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
329f0 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
32a00 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
32a10 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
32a20 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
32a30 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
32a40 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
32a50 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
32a60 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
32a70 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
32a80 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
32a90 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
32aa0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
32ab0 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
32ac0 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
32ad0 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
32ae0 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
32af0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
32b00 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
32b10 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
32b20 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
32b30 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
32b40 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
32b50 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
32b60 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
32b70 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
32b80 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
32b90 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
32ba0 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
32bb0 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
32bc0 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
32bd0 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
32be0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
32bf0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
32c00 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
32c10 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
32c20 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
32c30 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
32c40 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
32c50 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
32c60 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
32c70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
32c80 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
32c90 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
32ca0 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
32cb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
32cc0 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
32cd0 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
32ce0 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
32cf0 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
32d00 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
32d10 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
32d20 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
32d30 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
32d40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
32d50 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
32d60 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
32d70 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
32d80 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
32d90 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
32da0 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
32db0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
32dc0 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
32dd0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
32de0 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
32df0 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
32e00 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
32e10 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
32e20 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
32e30 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
32e40 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
32e50 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
32e60 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
32e70 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
32e80 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
32e90 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
32ea0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
32eb0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
32ec0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
32ed0 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
32ee0 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
32ef0 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
32f00 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
32f10 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
32f20 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
32f30 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
32f40 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
32f50 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
32f60 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
32f70 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
32f80 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
32f90 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
32fa0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
32fb0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
32fc0 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
32fd0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
32fe0 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
32ff0 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
33000 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
33010 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
33020 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
33030 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
33040 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
33050 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
33060 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
33070 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
33080 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
33090 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
330a0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
330b0 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
330c0 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
330d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
330e0 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
330f0 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
33100 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
33110 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
33120 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
33130 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
33140 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
33150 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
33160 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
33170 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
33180 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
33190 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
331a0 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
331b0 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
331c0 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
331d0 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
331e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
331f0 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
33200 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
33210 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
33220 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
33230 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64  _NOMEM..*/.#if d
33240 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
33250 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20   && _MSC_VER >= 
33260 31 37 30 30 20 26 26 20 64 65 66 69 6e 65 64 28  1700 && defined(
33270 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d 61 20  _M_ARM).#pragma 
33280 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f 66 66  optimize("", off
33290 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
332a0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
332b0 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oot(.  MemPage *
332c0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  pParent,        
332d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
332e0 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67   page of sibling
332f0 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
33300 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
33310 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  tIdx,           
33320 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
33330 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20  f "the page" in 
33340 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20  pParent */.  u8 
33350 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20  *aOvflSpace,    
33360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33370 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
33380 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72  of space for par
33390 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e  ent ovfl */.  in
333a0 74 20 69 73 52 6f 6f 74 2c 20 20 20 20 20 20 20  t isRoot,       
333b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
333c0 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
333d0 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   is a root-page 
333e0 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b 20 20  */.  int bBulk  
333f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33400 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
33410 74 68 69 73 20 63 61 6c 6c 20 69 73 20 70 61 72  this call is par
33420 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f 61 64  t of a bulk load
33430 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
33440 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
33450 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
33460 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
33470 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
33480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33490 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
334a0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
334b0 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
334c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
334d0 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
334e0 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
334f0 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
33500 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
33510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33520 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
33530 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
33540 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
33550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33560 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
33570 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
33580 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
33590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
335a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
335b0 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
335c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335d0 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
335e0 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
335f0 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
33600 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33610 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
33620 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
33630 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65  .  u16 leafCorre
33640 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
33650 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
33660 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
33670 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
33680 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
33690 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
336a0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
336b0 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
336c0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
336d0 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
336e0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
336f0 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
33700 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
33710 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
33720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
33730 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
33740 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
33750 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
33760 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
33770 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
33780 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
33790 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
337a0 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
337b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
337c0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
337d0 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
337e0 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20  iOvflSpace = 0; 
337f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
33800 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
33810 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f   aOvflSpace[] */
33820 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
33830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33840 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
33850 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
33860 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
33870 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
33880 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
33890 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
338a0 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  lings */.  MemPa
338b0 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
338c0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
338d0 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
338e0 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
338f0 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
33900 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
33910 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
33920 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
33930 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
33940 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20   u8 *pRight;    
33950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33960 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72   Location in par
33970 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62  ent of right-sib
33980 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ling pointer */.
33990 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31    u8 *apDiv[NB-1
339a0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
339b0 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
339c0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
339d0 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
339e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
339f0 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
33a00 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
33a10 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
33a20 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
33a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
33a40 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
33a50 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
33a60 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
33a70 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
33a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
33a90 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
33aa0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
33ab0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
33ac0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
33ad0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
33ae0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
33af0 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
33b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b10 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
33b20 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
33b30 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f   cells */.  Pgno
33b40 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
33b50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
33b60 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20   var to store a 
33b70 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a  page number in *
33b80 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65  /..  pBt = pPare
33b90 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  nt->pBt;.  asser
33ba0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
33bb0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
33bc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
33bd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33be0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
33bf0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66  pDbPage) );..#if
33c00 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   0.  TRACE(("BAL
33c10 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
33c20 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
33c30 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
33c40 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
33c50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
33c60 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61  t this point pPa
33c70 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74  rent may have at
33c80 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c   most one overfl
33c90 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a  ow cell. And if.
33ca0 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c    ** this overfl
33cb0 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65  ow cell is prese
33cc0 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  nt, it must be t
33cd0 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20  he cell with .  
33ce0 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74  ** index iParent
33cf0 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72  Idx. This scenar
33d00 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  io comes about w
33d10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
33d20 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  n.  ** is called
33d30 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72   (indirectly) fr
33d40 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  om sqlite3BtreeD
33d50 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  elete()..  */.  
33d60 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
33d70 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
33d80 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
33d90 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  low==1 );.  asse
33da0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
33db0 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
33dc0 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d  rent->aiOvfl[0]=
33dd0 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a  =iParentIdx );..
33de0 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63    if( !aOvflSpac
33df0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
33e00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
33e10 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
33e20 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
33e30 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20  o balance. Also 
33e40 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73  locate the cells
33e50 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a   in pParent .  *
33e60 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68  * that divide th
33e70 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61  e siblings. An a
33e80 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
33e90 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
33ea0 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68  gs on .  ** eith
33eb0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
33ec0 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  . More siblings 
33ed0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
33ee0 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
33ef0 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  , .  ** if there
33f00 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
33f10 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
33f20 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49  he other side. I
33f30 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68  f pParent.  ** h
33f40 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63  as NB or fewer c
33f50 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c  hildren then all
33f60 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
33f70 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20  rent are taken. 
33f80 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
33f90 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73   loop also drops
33fa0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
33fb0 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ls from the pare
33fc0 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20  nt page. This.  
33fd0 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61  ** way, the rema
33fe0 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e  inder of the fun
33ff0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68  ction does not h
34000 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ave to deal with
34010 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c   any.  ** overfl
34020 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ow cells in the 
34030 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e  parent page, sin
34040 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65  ce if any existe
34050 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a  d they will.  **
34060 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
34070 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f  en removed..  */
34080 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e  .  i = pParent->
34090 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72  nOverflow + pPar
340a0 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  ent->nCell;.  if
340b0 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44  ( i<2 ){.    nxD
340c0 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  iv = 0;.  }else{
340d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75  .    assert( bBu
340e0 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d  lk==0 || bBulk==
340f0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  1 );.    if( iPa
34100 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
34110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
34120 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
34130 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
34140 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
34150 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
34160 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73  +bBulk;.    }els
34170 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
34180 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20   bBulk==0 );.   
34190 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
341a0 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
341b0 20 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a     i = 2-bBulk;.
341c0 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b 31    }.  nOld = i+1
341d0 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76  ;.  if( (i+nxDiv
341e0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
341f0 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  low)==pParent->n
34200 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67  Cell ){.    pRig
34210 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61  ht = &pParent->a
34220 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
34230 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65  rOffset+8];.  }e
34240 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20  lse{.    pRight 
34250 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
34260 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
34270 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
34280 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65  .  }.  pgno = ge
34290 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a  t4byte(pRight);.
342a0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
342b0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
342c0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
342d0 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a   &apOld[i], 0);.
342e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
342f0 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
34300 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
34310 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
34320 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
34330 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
34340 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
34350 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
34360 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
34370 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
34380 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b  (i--)==0 ) break
34390 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44  ;..    if( i+nxD
343a0 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f  iv==pParent->aiO
343b0 76 66 6c 5b 30 5d 20 26 26 20 70 50 61 72 65 6e  vfl[0] && pParen
343c0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  t->nOverflow ){.
343d0 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
343e0 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c   pParent->apOvfl
343f0 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  [0];.      pgno 
34400 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
34410 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
34420 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
34430 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
34440 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61  v[i]);.      pPa
34450 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
34460 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
34470 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
34480 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
34490 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
344a0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
344b0 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
344c0 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
344d0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
344e0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
344f0 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
34500 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70  ;..      /* Drop
34510 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   the cell from t
34520 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
34530 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70  apDiv[i] still p
34540 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  oints to.      *
34550 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  * the cell withi
34560 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76  n the parent, ev
34570 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73  en though it has
34580 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20   been dropped.. 
34590 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
345a0 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f  safe because dro
345b0 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c  pping a cell onl
345c0 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  y overwrites the
345d0 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
345e0 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74  four bytes of it
345f0 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
34600 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
34610 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  d the first.    
34620 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
34630 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
34640 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e  ell. So the poin
34650 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75  ter is safe to u
34660 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65  se.      ** late
34670 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a  r on.  .      **
34680 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
34690 74 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 73  t if we are in s
346a0 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
346b0 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65 6c  e. In secure-del
346c0 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20  ete mode,.      
346d0 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
346e0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
346f0 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
34700 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
34710 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
34720 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
34730 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
34740 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
34750 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
34760 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
34770 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
34780 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
34790 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
347a0 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
347b0 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
347c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
347d0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
347e0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
347f0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
34800 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f  Off;..        iO
34810 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ff = SQLITE_PTR_
34820 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29  TO_INT(apDiv[i])
34830 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   - SQLITE_PTR_TO
34840 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44  _INT(pParent->aD
34850 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
34860 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d  ( (iOff+szNew[i]
34870 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  )>(int)pBt->usab
34880 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
34890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
348a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
348b0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
348c0 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73  pOld, 0, (i+1)*s
348d0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29  izeof(MemPage*))
348e0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
348f0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
34900 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
34910 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
34920 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  y(&aOvflSpace[iO
34930 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  ff], apDiv[i], s
34940 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zNew[i]);.      
34950 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
34960 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
34970 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
34980 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta];.        }. 
34990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f       }.      dro
349a0 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  pCell(pParent, i
349b0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
349c0 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77  nOverflow, szNew
349d0 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  [i], &rc);.    }
349e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
349f0 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
34a00 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
34a10 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
34a20 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
34a30 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
34a40 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
34a50 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
34a60 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
34a70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
34a80 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
34a90 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69   k = pBt->pageSi
34aa0 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ze + ROUND8(size
34ab0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
34ac0 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
34ad0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
34ae0 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
34af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34b00 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
34b10 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
34b20 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
34b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34b40 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
34b50 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
34b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34b80 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
34b90 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20    + k*nOld;     
34ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bc0 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28  /* Page copies (
34bd0 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43  apCopy) */.  apC
34be0 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
34bf0 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
34c00 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
34c10 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
34c20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
34c30 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
34c40 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
34c50 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
34c60 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
34c70 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31  ells];.  aSpace1
34c80 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
34c90 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
34ca0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
34cb0 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63  _ALIGNMENT(aSpac
34cc0 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  e1) );..  /*.  *
34cd0 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
34ce0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
34cf0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
34d00 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
34d10 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
34d20 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
34d30 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
34d40 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
34d50 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
34d60 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
34d70 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b  ed from aSpace1[
34d80 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
34d90 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
34da0 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
34db0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
34dc0 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
34dd0 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
34de0 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
34df0 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
34e00 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
34e10 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
34e20 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
34e30 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
34e40 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
34e50 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
34e60 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
34e70 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
34e80 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
34e90 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
34ea0 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
34eb0 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
34ec0 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
34ed0 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
34ee0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
34ef0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
34f00 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
34f10 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
34f20 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
34f30 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
34f40 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
34f50 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
34f60 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
34f70 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
34f80 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
34f90 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
34fa0 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
34fb0 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
34fc0 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  */.  leafCorrect
34fd0 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ion = apOld[0]->
34fe0 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
34ff0 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68  ta = apOld[0]->h
35000 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
35010 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
35020 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a  .    int limit;.
35030 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f      .    /* Befo
35040 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
35050 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63  g else, take a c
35060 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20  opy of the i'th 
35070 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67  original sibling
35080 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74  .    ** The rest
35090 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
350a0 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
350b0 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
350c0 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68  rather.    ** th
350d0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
350e0 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
350f0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
35100 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
35110 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
35120 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
35130 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  n.  */.    MemPa
35140 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
35150 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
35160 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70  )&aSpace1[pBt->p
35170 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a  ageSize + k*i];.
35180 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c      memcpy(pOld,
35190 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
351a0 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
351b0 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28   pOld->aData = (
351c0 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a  void*)&pOld[1];.
351d0 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d      memcpy(pOld-
351e0 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
351f0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
35200 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69  geSize);..    li
35210 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
35220 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
35230 77 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 2d  w;.    if( pOld-
35240 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a  >nOverflow>0 ){.
35250 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
35260 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
35270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
35280 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
35290 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
352a0 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
352b0 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
352c0 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
352d0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
352e0 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
352f0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
35300 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
35310 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35320 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61 74  {.      u8 *aDat
35330 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b  a = pOld->aData;
35340 0a 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 50  .      u16 maskP
35350 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b  age = pOld->mask
35360 50 61 67 65 3b 0a 20 20 20 20 20 20 75 31 36 20  Page;.      u16 
35370 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c  cellOffset = pOl
35380 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  d->cellOffset;. 
35390 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
353a0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
353b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
353c0 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
353d0 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
353e0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  Cell] = findCell
353f0 76 32 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61  v2(aData, maskPa
35400 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20  ge, cellOffset, 
35410 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
35420 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
35430 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
35440 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
35450 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
35460 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 20       }.    }    
35470 20 20 20 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f     .    if( i<nO
35480 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74  ld-1 && !leafDat
35490 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a  a){.      u16 sz
354a0 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d   = (u16)szNew[i]
354b0 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
354c0 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
354d0 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
354e0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
354f0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
35500 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
35510 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20  ace1[iSpace1];. 
35520 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
35530 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
35540 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f  ( sz<=pBt->maxLo
35550 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20  cal+23 );.      
35560 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31 20  assert( iSpace1 
35570 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67  <= (int)pBt->pag
35580 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d  eSize );.      m
35590 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
355a0 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
355b0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
355c0 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
355d0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73  ection;.      as
355e0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
355f0 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
35600 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
35610 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
35620 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65  ll] = szCell[nCe
35630 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63  ll] - leafCorrec
35640 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
35650 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
35660 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
35670 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
35680 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
35690 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  rt( pOld->hdrOff
356a0 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
356b0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
356c0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
356d0 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
356e0 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
356f0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
35700 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
35710 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
35720 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
35730 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
35740 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[8], 4);.    
35750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35760 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
35770 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
35780 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
35790 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
357a0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
357b0 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
357c0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
357d0 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
357e0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
357f0 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 4;.        }
35800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
35810 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
35820 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
35830 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
35840 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
35850 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
35860 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
35870 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
35880 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
35890 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
358a0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
358b0 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
358c0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
358d0 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
358e0 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
358f0 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
35900 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
35910 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
35920 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
35930 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
35940 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
35950 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
35960 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
35970 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
35980 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
35990 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
359a0 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
359b0 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
359c0 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
359d0 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
359e0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
359f0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
35a00 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
35a10 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
35a20 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
35a30 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
35a40 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
35a50 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
35a60 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
35a70 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
35a80 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
35a90 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
35aa0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
35ab0 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
35ac0 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
35ad0 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
35ae0 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
35af0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
35b00 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
35b10 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
35b20 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
35b30 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
35b40 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
35b50 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
35b60 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
35b70 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
35b80 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
35b90 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
35ba0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
35bb0 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
35bc0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
35bd0 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
35be0 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
35bf0 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69      k++;.      i
35c00 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20  f( k>NB+1 ){ rc 
35c10 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
35c20 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  _BKPT; goto bala
35c30 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
35c40 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
35c50 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
35c60 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
35c70 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
35c80 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
35c90 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
35ca0 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
35cb0 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
35cc0 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
35cd0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
35ce0 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
35cf0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
35d00 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
35d10 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
35d20 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
35d30 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
35d40 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
35d50 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
35d60 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
35d70 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
35d80 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
35d90 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
35da0 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
35db0 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
35dc0 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
35dd0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
35de0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
35df0 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
35e00 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
35e10 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
35e20 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
35e30 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
35e40 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
35e50 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
35e60 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
35e70 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
35e80 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
35e90 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
35ea0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
35eb0 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
35ec0 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
35ed0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
35ee0 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
35ef0 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
35f00 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
35f10 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
35f20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
35f30 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
35f40 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
35f50 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
35f60 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
35f70 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
35f80 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
35f90 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
35fa0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
35fb0 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
35fc0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
35fd0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
35fe0 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
35ff0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
36000 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
36010 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
36020 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
36030 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 0a 20  e( szRight==0 . 
36040 20 20 20 20 20 20 7c 7c 20 28 21 62 42 75 6c 6b        || (!bBulk
36050 20 26 26 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   && szRight+szCe
36060 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
36070 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a  (szCell[r]+2)) .
36080 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 7a 52      ){.      szR
36090 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64  ight += szCell[d
360a0 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c  ] + 2;.      szL
360b0 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d  eft -= szCell[r]
360c0 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e   + 2;.      cntN
360d0 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20  ew[i-1]--;.     
360e0 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
360f0 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20   - 1;.      d = 
36100 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
36110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65  ;.    }.    szNe
36120 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a  w[i] = szRight;.
36130 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d      szNew[i-1] =
36140 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20   szLeft;.  }..  
36150 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75  /* Either we fou
36160 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  nd one or more c
36170 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29  ells (cntnew[0])
36180 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a  >0) or pPage is.
36190 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
361a0 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
361b0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
361c0 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
361d0 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
361e0 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
361f0 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
36200 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
36210 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 50 44 41 54  .  **.  ** UPDAT
36220 45 3a 20 20 54 68 65 20 61 73 73 65 72 74 28 29  E:  The assert()
36230 20 62 65 6c 6f 77 20 69 73 20 6e 6f 74 20 6e 65   below is not ne
36240 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 69  cessarily true i
36250 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
36260 20 2a 2a 20 66 69 6c 65 20 69 73 20 63 6f 72 72   ** file is corr
36270 75 70 74 2e 20 20 54 68 65 20 63 6f 72 72 75 70  upt.  The corrup
36280 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 65 74  tion will be det
36290 65 63 74 65 64 20 61 6e 64 20 72 65 70 6f 72 74  ected and report
362a0 65 64 20 6c 61 74 65 72 0a 20 20 2a 2a 20 69 6e  ed later.  ** in
362b0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
362c0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  so there is no n
362d0 65 65 64 20 74 6f 20 61 63 74 20 75 70 6f 6e 20  eed to act upon 
362e0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66  it now..  */.#if
362f0 20 30 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   0.  assert( cnt
36300 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
36310 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
36320 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
36330 3d 30 29 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  =0) );.#endif.. 
36340 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
36350 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
36360 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d   ",.    apOld[0]
36370 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c  ->pgno, .    nOl
36380 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d  d>=2 ? apOld[1]-
36390 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e  >pgno : 0,.    n
363a0 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32  Old>=3 ? apOld[2
363b0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29  ]->pgno : 0.  ))
363c0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
363d0 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
363e0 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
363f0 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
36400 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61  le..  */.  if( a
36410 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31  pOld[0]->pgno<=1
36420 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
36430 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
36440 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
36450 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
36460 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70    pageFlags = ap
36470 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d  Old[0]->aData[0]
36480 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
36490 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
364a0 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
364b0 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
364c0 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
364d0 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
364e0 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
364f0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
36500 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36510 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
36520 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
36530 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
36540 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
36550 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
36560 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
36570 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
36580 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
36590 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
365a0 6f 2c 20 28 62 42 75 6c 6b 20 3f 20 31 20 3a 20  o, (bBulk ? 1 : 
365b0 70 67 6e 6f 29 2c 20 30 29 3b 0a 20 20 20 20 20  pgno), 0);.     
365c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
365d0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
365e0 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
365f0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
36600 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  w++;..      /* S
36610 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
36620 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ap entry for the
36630 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
36640 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
36650 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
36660 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
36670 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
36680 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
36690 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
366a0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
366b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
366c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
366d0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
366e0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
366f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
36700 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
36710 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
36720 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
36730 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
36740 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
36750 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  ){.    freePage(
36760 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a  apOld[i], &rc);.
36770 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
36780 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
36790 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
367a0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
367b0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
367c0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
367d0 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
367e0 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
367f0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
36800 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
36810 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
36820 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
36830 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
36840 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
36850 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
36860 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
36870 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
36880 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
36890 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
368a0 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
368b0 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
368c0 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
368d0 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
368e0 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
368f0 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
36900 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
36910 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
36920 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
36930 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
36940 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
36950 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
36960 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
36970 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
36980 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
36990 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
369a0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
369b0 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
369c0 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
369d0 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
369e0 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
369f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
36a00 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
36a10 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e  inV = apNew[i]->
36a20 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69  pgno;.    int mi
36a30 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
36a40 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
36a50 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  {.      if( apNe
36a60 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69  w[j]->pgno<(unsi
36a70 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
36a80 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
36a90 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70         minV = ap
36aa0 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[j]->pgno;.  
36ab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
36ac0 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
36ad0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
36ae0 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
36af0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  w[i];.      apNe
36b00 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
36b10 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
36b20 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
36b30 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
36b40 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
36b50 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
36b60 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
36b70 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apNew[0]->pgno, 
36b80 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
36b90 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d  ew>=2 ? apNew[1]
36ba0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
36bb0 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
36bc0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
36bd0 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f  ? apNew[2]->pgno
36be0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
36bf0 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
36c00 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65    nNew>=4 ? apNe
36c10 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[3]->pgno : 0, 
36c20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
36c30 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
36c40 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e  >=5 ? apNew[4]->
36c50 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
36c60 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
36c70 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ));..  assert( s
36c80 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36c90 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
36ca0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75  pDbPage) );.  pu
36cb0 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61  t4byte(pRight, a
36cc0 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67  pNew[nNew-1]->pg
36cd0 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  no);..  /*.  ** 
36ce0 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
36cf0 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
36d00 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
36d10 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
36d20 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
36d30 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
36d40 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
36d50 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
36d60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
36d70 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
36d80 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
36d90 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
36da0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
36db0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
36dc0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
36dd0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a  axCells );.    z
36de0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
36df0 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
36e00 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
36e10 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
36e20 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
36e30 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
36e40 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
36e50 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
36e60 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
36e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
36e80 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
36e90 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  );..    j = cntN
36ea0 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
36eb0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
36ec0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
36ed0 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
36ee0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
36ef0 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
36f00 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
36f10 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
36f20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
36f30 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d   assert( i<nNew-
36f40 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  1 || j==nCell );
36f50 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c  .    if( j<nCell
36f60 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
36f70 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
36f80 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
36f90 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
36fa0 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
36fb0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
36fc0 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
36fd0 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
36fe0 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
36ff0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
37000 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66  &aOvflSpace[iOvf
37010 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69  lSpace];.      i
37020 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
37030 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
37040 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
37050 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
37060 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
37070 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
37080 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
37090 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
370a0 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
370b0 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
370c0 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
370d0 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
370e0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
370f0 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
37100 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
37110 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
37120 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
37130 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
37140 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
37150 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
37160 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
37170 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
37180 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
37190 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
371a0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
371b0 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
371c0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
371d0 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
371e0 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
371f0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
37200 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34  ;.        sz = 4
37210 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43   + putVarint(&pC
37220 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65  ell[4], info.nKe
37230 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  y);.        pTem
37240 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
37250 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
37260 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
37270 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
37280 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
37290 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
372a0 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
372b0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
372c0 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
372d0 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
372e0 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
372f0 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
37300 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
37310 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
37320 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
37330 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
37340 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72  ** (see btreePar
37350 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
37360 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
37370 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
37380 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
37390 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
373a0 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
373b0 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
373c0 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
373d0 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
373e0 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
373f0 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
37400 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
37410 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
37420 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
37430 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
37440 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
37450 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
37460 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
37470 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
37480 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
37490 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
374a0 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
374b0 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
374c0 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
374d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
374e0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
374f0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
37500 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
37510 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
37520 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
37530 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
37540 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
37550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37560 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b  OvflSpace += sz;
37570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
37580 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
37590 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
375a0 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 20  ert( iOvflSpace 
375b0 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67  <= (int)pBt->pag
375c0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
375d0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
375e0 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
375f0 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77   sz, pTemp, pNew
37600 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
37610 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37620 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
37630 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
37640 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
37650 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37660 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
37670 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
37680 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
37690 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
376a0 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
376b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
376c0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
376d0 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
376e0 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
376f0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
37700 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
37710 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
37720 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
37730 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
37740 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
37750 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a  zChild, 4);.  }.
37760 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26  .  if( isRoot &&
37770 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
37780 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68  =0 && pParent->h
37790 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b  drOffset<=apNew[
377a0 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  0]->nFree ){.   
377b0 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
377c0 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
377d0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  now contains no 
377e0 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20  cells. The only 
377f0 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70  sibling.    ** p
37800 61 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74  age is the right
37810 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
37820 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63  rent. Copy the c
37830 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
37840 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65     ** child page
37850 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
37860 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65  , decreasing the
37870 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20   overall height 
37880 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d  of the.    ** b-
37890 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62  tree structure b
378a0 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64  y one. This is d
378b0 65 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20  escribed as the 
378c0 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77  "balance-shallow
378d0 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61  er".    ** sub-a
378e0 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65  lgorithm in some
378f0 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
37900 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
37910 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
37920 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
37930 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  , the call to co
37940 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20  pyNodeContent() 
37950 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c  .    ** sets all
37960 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37970 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
37980 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69  ng to database i
37990 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  mage pages .    
379a0 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ** for which the
379b0 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72   pointer is stor
379c0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f  ed within the co
379d0 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69  ntent being copi
379e0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
379f0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73  * The second ass
37a00 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69  ert below verifi
37a10 65 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c  es that the chil
37a20 64 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67  d page is defrag
37a30 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69  mented.    ** (i
37a40 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74  t must be, as it
37a50 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73   was just recons
37a60 74 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73  tructed using as
37a70 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54  semblePage()). T
37a80 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d  his.    ** is im
37a90 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70  portant if the p
37aa0 61 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65  arent page happe
37ab0 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20  ns to be page 1 
37ac0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
37ad0 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a      ** image.  *
37ae0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e  /.    assert( nN
37af0 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ew==1 );.    ass
37b00 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e  ert( apNew[0]->n
37b10 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20  Free == .       
37b20 20 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65   (get2byte(&apNe
37b30 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d  w[0]->aData[5])-
37b40 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66  apNew[0]->cellOf
37b50 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  fset-apNew[0]->n
37b60 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a  Cell*2) .    );.
37b70 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74      copyNodeCont
37b80 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50  ent(apNew[0], pP
37b90 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20  arent, &rc);.   
37ba0 20 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b   freePage(apNew[
37bb0 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73  0], &rc);.  }els
37bc0 65 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55  e if( ISAUTOVACU
37bd0 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78  UM ){.    /* Fix
37be0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
37bf0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
37c00 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20   the cells that 
37c10 77 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f  were shifted aro
37c20 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65  und. .    ** The
37c30 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64  re are several d
37c40 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
37c50 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  f pointer-map en
37c60 74 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20  tries that need 
37c70 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  to.    ** be dea
37c80 6c 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20  lt with by this 
37c90 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66  routine. Some of
37ca0 20 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e   these have been
37cb0 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75   set already, bu
37cc0 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61  t.    ** many ha
37cd0 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c  ve not. The foll
37ce0 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61  owing is a summa
37cf0 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry:.    **.    *
37d00 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69  *   1) The entri
37d10 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
37d20 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  th new sibling p
37d30 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
37d40 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73  ot.    **      s
37d50 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69  iblings when thi
37d60 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
37d70 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76  alled. These hav
37d80 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  e already.    **
37d90 20 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20        been set. 
37da0 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  We don't need to
37db0 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64   worry about old
37dc0 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
37dd0 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ere.    **      
37de0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
37df0 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65  e-list - the fre
37e00 65 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73  ePage() code has
37e10 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20   taken care.    
37e20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  **      of those
37e30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
37e40 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72    2) The pointer
37e50 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73  -map entries ass
37e60 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
37e70 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a   first overflow.
37e80 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65      **      page
37e90 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77   in any overflow
37ea0 20 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20   chains used by 
37eb0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
37ec0 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a  s. These .    **
37ed0 20 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20        have also 
37ee0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b  already been tak
37ef0 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68  en care of by th
37f00 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63  e insertCell() c
37f10 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
37f20 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73  **   3) If the s
37f30 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
37f40 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
37f50 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
37f60 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20  s of.    **     
37f70 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e   cells stored on
37f80 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
37f90 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  es may need to b
37fa0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
37fb0 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66  *.    **   4) If
37fc0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
37fd0 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  es are not inter
37fe0 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
37ff0 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a  , then any.    *
38000 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20  *      overflow 
38010 70 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68  pages used by th
38020 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65  ese cells may ne
38030 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
38040 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e  .    **      (in
38050 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f  ternal intkey no
38060 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  des never contai
38070 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76  n pointers to ov
38080 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20  erflow pages).. 
38090 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35     **.    **   5
380a0 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
380b0 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
380c0 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
380d0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
380e0 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20  **      entries 
380f0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68  for the right-ch
38100 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63  ild pages of eac
38110 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65  h sibling may ne
38120 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  ed.    **      t
38130 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
38140 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65    **.    ** Case
38150 73 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65  s 1 and 2 are de
38160 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62  alt with above b
38170 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68  y other code. Th
38180 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
38190 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63  ock deals with c
381a0 61 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64  ases 3 and 4 and
381b0 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74   the one after t
381c0 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e  hat, case 5. Sin
381d0 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  ce.    ** settin
381e0 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  g a pointer map 
381f0 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74  entry is a relat
38200 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20  ively expensive 
38210 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a  operation, this.
38220 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79      ** code only
38230 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61   sets pointer ma
38240 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68  p entries for ch
38250 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
38260 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
38270 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
38280 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61  moved between pa
38290 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ges.  */.    Mem
382a0 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
382b0 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61  ew[0];.    MemPa
382c0 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
382d0 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f  y[0];.    int nO
382e0 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
382f0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
38300 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f  nt iNextOld = pO
38310 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65  ld->nCell + nOve
38320 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
38330 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65  Overflow = (nOve
38340 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 69  rflow ? pOld->ai
38350 4f 76 66 6c 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20  Ovfl[0] : -1);. 
38360 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20     j = 0;       
38370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38380 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
38390 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70   'old' sibling p
383a0 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30  age */.    k = 0
383b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
383c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
383d0 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73   Current 'new' s
383e0 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
383f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
38400 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
38410 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d   int isDivider =
38420 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
38430 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a   i==iNextOld ){.
38440 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
38450 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
38460 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
38470 69 6e 67 20 74 6