/ Hex Artifact Content
Login

Artifact fe2d11c8c0d99e324614141ad012b37d0601cf59:


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 74 6f 70 3b 20 20   */.  int top;  
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 46 69             /* Fi
9b40: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
9b50: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
9b60: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
9b70: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9b80: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
9b90: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
9ba0: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
9bb0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
9bc0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
9bd0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9be0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
9bf0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
9c00: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
9c10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9c20: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9c30: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9c40: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
9c50: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
9c60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9c70: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9c80: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9c90: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
9ca0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
9cb0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
9cc0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
9cd0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
9ce0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
9cf0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
9d00: 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ==0 );.  usableS
9d10: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
9d20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
9d30: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20  assert( nByte < 
9d40: 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a  usableSize-8 );.
9d50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9d60: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
9d70: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
9d80: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
9d90: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
9da0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
9db0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
9dc0: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
9dd0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9de0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
9df0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
9e00: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
9e10: 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36  ){.      top = 6
9e20: 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  5536;.    }else{
9e30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9e40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9e50: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
9e60: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65  /* If there is e
9e70: 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77  nough space betw
9e80: 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20  een gap and top 
9e90: 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c  for one more cel
9ea0: 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61  l pointer.  ** a
9eb0: 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65  rray entry offse
9ec0: 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66 72  t, and if the fr
9ed0: 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d  eelist is not em
9ee0: 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68  pty, then search
9ef0: 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69   the.  ** freeli
9f00: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9f10: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9f20: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9f30: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20   the request..  
9f40: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
9f50: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
9f60: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
9f70: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9f80: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20  e( gap==top );. 
9f90: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
9fa0: 26 26 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20  && (data[hdr+1] 
9fb0: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20  || data[hdr+2]) 
9fc0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  ){.    int pc, a
9fd0: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
9fe0: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
9ff0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
a000: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
a010: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
a020: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a030: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
a040: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  e slot */.      
a050: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
a060: 65 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34  e-4 || pc<addr+4
a070: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
a080: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a090: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
a0a0: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
a0b0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
a0c0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ]);.      if( si
a0d0: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
a0e0: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a       int x = siz
a0f0: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
a100: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
a110: 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4 );.        tes
a120: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
a130: 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29         if( x<4 )
a140: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a150: 64 61 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30 20  data[hdr+7]>=60 
a160: 29 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e  ) goto defragmen
a170: 74 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  t_page;.        
a180: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
a190: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
a1a0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
a1b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
a1c0: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
a1d0: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
a1e0: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
a1f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
a200: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
a210: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
a220: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
a230: 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20  7] += (u8)x;.   
a240: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
a250: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
a260: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
a270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a280: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a290: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
a2b0: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
a2c0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
a2d0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
a2e0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
a2f0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
a300: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
a310: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
a320: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
a330: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
a340: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
a350: 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d  .        *pIdx =
a360: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
a370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a380: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
a390: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
a3a0: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
a3b0: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
a3c0: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
a3d0: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
a3e0: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
a3f0: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
a400: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
a410: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
a420: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
a430: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
a440: 74 6f 70 20 29 7b 0a 64 65 66 72 61 67 6d 65 6e  top ){.defragmen
a450: 74 5f 70 61 67 65 3a 0a 20 20 20 20 74 65 73 74  t_page:.    test
a460: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
a470: 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ll==0 );.    rc 
a480: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
a490: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
a4a0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a4b0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
a4c0: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
a4d0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
a4e0: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
a4f0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
a500: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
a510: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
a520: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
a530: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
a540: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
a550: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a560: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
a570: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
a580: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
a590: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
a5a0: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
a5b0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
a5c0: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
a5d0: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
a5e0: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
a5f0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
a600: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
a610: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
a620: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
a630: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
a640: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
a650: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
a660: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a670: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a680: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
a690: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
a6a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a6b0: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
a6c0: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
a6d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a6e0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
a6f0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
a700: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
a710: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
a720: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
a730: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
a740: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
a750: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
a760: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a770: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
a780: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
a790: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
a7a0: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
a7b0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
a7c0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
a7d0: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
a7e0: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
a7f0: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
a800: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
a810: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
a820: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
a830: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
a840: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
a850: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
a860: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
a870: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
a880: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
a890: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
a8a0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
a8b0: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
a8c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
a8d0: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
a8e0: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
a8f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a900: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
a910: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
a920: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
a930: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
a940: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
a950: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
a960: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
a990: 73 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20  s of pointer to 
a9a0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
a9b0: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
a9c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
a9e0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
a9f0: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
aa00: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
aa30: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
aa40: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
aa50: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
aa80: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
aa90: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
aaa0: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
aab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
aac0: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
aad0: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
aae0: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
aaf0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
ab00: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
ab10: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
ab20: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
ab30: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
ab40: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
ab50: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
ab60: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
ab70: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
ab80: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
ab90: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
aba0: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
abb0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
abc0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
abd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
abe0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
abf0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
ac00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
ac10: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
ac20: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
ac30: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
ac40: 20 61 73 73 65 72 74 28 20 69 45 6e 64 20 3c 3d   assert( iEnd <=
ac50: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
ac60: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
ac70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ac80: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
ac90: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
aca0: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
acb0: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
acc0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
acd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
ace0: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20  art<=iLast );.. 
acf0: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
ad00: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
ad10: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
ad20: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
ad30: 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  ete.  ** option 
ad40: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
ad50: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
ad60: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
ad70: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
ad80: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
ad90: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
ada0: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
adb0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
adc0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
add0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
ade0: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
adf0: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
ae00: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
ae10: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
ae20: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
ae30: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
ae40: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
ae50: 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 69  + 1;.  while( (i
ae60: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
ae70: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29  te(&data[iPtr]))
ae80: 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69  >0 && iFreeBlk<i
ae90: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 66 28  Start ){.    if(
aea0: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
aeb0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
aec0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
aed0: 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42     iPtr = iFreeB
aee0: 6c 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 46  lk;.  }.  if( iF
aef0: 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72  reeBlk>iLast ) r
af00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
af10: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 61 73 73  RUPT_BKPT;.  ass
af20: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
af30: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
af40: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  0 );..  /* At th
af50: 69 73 20 70 6f 69 6e 74 3a 0a 20 20 2a 2a 20 20  is point:.  **  
af60: 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69    iFreeBlk:   Fi
af70: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66  rst freeblock af
af80: 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a  ter iStart, or z
af90: 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 2a 2a  ero if none.  **
afa0: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
afb0: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
afc0: 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42 6c   pointer iFreeBl
afd0: 6b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63  k.  **.  ** Chec
afe0: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65  k to see if iFre
aff0: 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63  eBlk should be c
b000: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
b010: 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e  e end of iStart.
b020: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 65  .  */.  if( iFre
b030: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
b040: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
b050: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
b060: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 69 66 28   - iEnd;.    if(
b070: 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
b080: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b090: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b0a0: 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b   iEnd = iFreeBlk
b0b0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
b0c0: 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a  a[iFreeBlk+2]);.
b0d0: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
b0e0: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 69   - iStart;.    i
b0f0: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
b100: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
b110: 6b 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  k]);.  }..  /* I
b120: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
b130: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
b140: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
b150: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
b160: 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 69  t pointer.  ** i
b170: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
b180: 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  r) then check to
b190: 20 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73   see if iStart s
b1a0: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
b1b0: 65 64 20 0a 20 20 2a 2a 20 6f 6e 74 6f 20 74 68  ed .  ** onto th
b1c0: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
b1d0: 20 2a 2f 0a 20 20 69 66 28 20 69 50 74 72 3e 68   */.  if( iPtr>h
b1e0: 64 72 2b 31 20 29 7b 0a 20 20 20 20 69 6e 74 20  dr+1 ){.    int 
b1f0: 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b  iPtrEnd = iPtr +
b200: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b210: 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 69 66  iPtr+2]);.    if
b220: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
b230: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
b240: 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20   iPtrEnd>iStart 
b250: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
b260: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b270: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
b280: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
b290: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
b2a0: 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  d - iPtr;.      
b2b0: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
b2c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
b2d0: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
b2e0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
b2f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
b300: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
b310: 20 6e 46 72 61 67 3b 0a 20 20 69 66 28 20 69 50   nFrag;.  if( iP
b320: 74 72 3d 3d 68 64 72 2b 31 20 26 26 20 69 53 74  tr==hdr+1 && iSt
b330: 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64  art==get2byte(&d
b340: 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20  ata[hdr+5]) ){. 
b350: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72     /* The new fr
b360: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68  eeblock is at th
b370: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
b380: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b390: 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  area,.    ** so 
b3a0: 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20  just extend the 
b3b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
b3c0: 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72  a rather than cr
b3d0: 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  eate another.   
b3e0: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74   ** freelist ent
b3f0: 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  ry */.    put2by
b400: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  te(&data[hdr+1],
b410: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
b420: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
b430: 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20  dr+5], iEnd);.  
b440: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
b450: 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65  sert the new fre
b460: 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20  eblock into the 
b470: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20  freelist */.    
b480: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
b490: 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20  Ptr], iStart);. 
b4a0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
b4b0: 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65  a[iStart], iFree
b4c0: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
b4d0: 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b  te(&data[iStart+
b4e0: 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a  2], iSize);.  }.
b4f0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
b500: 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  = iOrigSize;.  r
b510: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
b530: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
b540: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
b550: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
b560: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
b570: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
b580: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
b590: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
b5a0: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
b5b0: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
b5c0: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
b5d0: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
b5e0: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
b5f0: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
b600: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
b610: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
b620: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
b630: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
b640: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
b650: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
b660: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
b670: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
b680: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
b690: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b6a0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
b6b0: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
b6c0: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
b6d0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
b6e0: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
b6f0: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
b700: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
b710: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
b720: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b730: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
b740: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
b750: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b760: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
b770: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
b780: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
b790: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
b7a0: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
b7b0: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
b7c0: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
b7d0: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
b7e0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
b7f0: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
b800: 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  eaf;.  pBt = pPa
b810: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
b820: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
b830: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
b840: 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67  KEY) ){.    pPag
b850: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
b860: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
b870: 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b  a = pPage->leaf;
b880: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
b890: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
b8a0: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
b8b0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
b8c0: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
b8d0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
b8e0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
b8f0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
b900: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
b910: 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20  >hasData = 0;.  
b920: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b930: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
b940: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
b950: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
b960: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
b970: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b980: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b990: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
b9a0: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
b9b0: 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
b9c0: 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
b9d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b9e0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
b9f0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
ba00: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
ba10: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
ba20: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
ba30: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
ba40: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
ba50: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
ba60: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
ba70: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
ba80: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
ba90: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
baa0: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
bab0: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
bac0: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
bad0: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
bae0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
baf0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
bb00: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
bb10: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
bb20: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
bb30: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
bb40: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
bb50: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
bb60: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
bb70: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
bb80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bb90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
bba0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
bbb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
bbc0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
bbd0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
bbe0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
bbf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
bc00: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
bc10: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
bc20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
bc30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
bc40: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
bc50: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
bc60: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
bc70: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
bc80: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
bc90: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
bca0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
bcb0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
bcc0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
bcd0: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
bce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
bcf0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
bd00: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
bd10: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
bd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
bd30: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
bd40: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
bd50: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
bd60: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
bd70: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
bd80: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
bd90: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
bda0: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
bdb0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
bdc0: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
bdd0: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
bde0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
bdf0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
be00: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
be10: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
be20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
be30: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
be40: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
be50: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
be60: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
be70: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
be80: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
be90: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
bea0: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
beb0: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
bec0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
bed0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
bee0: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
bef0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
bf00: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
bf10: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
bf20: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
bf30: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
bf40: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
bf50: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
bf60: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63  ata;.    if( dec
bf70: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
bf80: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
bf90: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
bfa0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
bfb0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
bfc0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
bfd0: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
bfe0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
bff0: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
c000: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
c010: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
c020: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
c030: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
c040: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
c050: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
c060: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
c070: 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
c080: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
c090: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
c0a0: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
c0b0: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
c0c0: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
c0d0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
c0e0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
c0f0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
c100: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
c110: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
c120: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
c130: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
c140: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
c150: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
c160: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
c170: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
c180: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
c190: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
c1a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c1b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
c1d0: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
c1e0: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
c1f0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
c200: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
c210: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
c220: 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
c230: 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a  t the end.    **
c240: 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61   of page when pa
c250: 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a  rsing a cell.  .
c260: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
c270: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
c280: 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73  k of code checks
c290: 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66   early to see if
c2a0: 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a   a cell extends.
c2b0: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
c2c0: 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
c2d0: 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
c2e0: 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
c2f0: 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72   to be .    ** r
c300: 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f  eturned if it do
c310: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
c320: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
c330: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
c340: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65  ->nCell;.    iCe
c350: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
c360: 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66  ize - 4;.#if def
c370: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
c380: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
c390: 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20  _CHECK).    {.  
c3a0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
c3b0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
c3c0: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
c3d0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
c3e0: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
c3f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
c400: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
c410: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
c420: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
c430: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c440: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
c450: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
c460: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
c470: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a  ta[cellOffset+i*
c480: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  2]);.        tes
c490: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
c4a0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20  First );.       
c4b0: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
c4c0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
c4d0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
c4e0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
c4f0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
c500: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c510: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c530: 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
c540: 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
c550: 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  c]);.        tes
c560: 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
c570: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
c580: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
c590: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c5a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c5b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c5c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c5d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
c5e0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
c5f0: 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20  llLast++;.    } 
c600: 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a   .#endif..    /*
c610: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
c620: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
c630: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
c640: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c650: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
c660: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
c670: 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20  dr+7] + top;.   
c680: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
c690: 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20        u16 next, 
c6a0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
c6b0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
c6c0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
c6d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  .        /* Star
c6e0: 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20  t of free block 
c6f0: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
c700: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
c710: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c720: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
c730: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
c740: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
c750: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
c760: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
c770: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
c780: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
c790: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
c7a0: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
c7b0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
c7c0: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
c7d0: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
c7e0: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
c7f0: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
c800: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
c810: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
c820: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
c830: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
c840: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c850: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
c860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
c870: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
c880: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
c890: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
c8a0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
c8b0: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
c8c0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
c8d0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
c8e0: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
c8f0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
c900: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
c910: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
c920: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
c930: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
c940: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
c950: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
c960: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
c970: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
c980: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
c990: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
c9a0: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
c9b0: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
c9c0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
c9d0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c9e0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
c9f0: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
ca00: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
ca10: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
ca20: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
ca30: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
ca40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
ca50: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
ca60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ca70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ca80: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
ca90: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
caa0: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
cab0: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
cac0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
cad0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
cae0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
caf0: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
cb00: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
cb10: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
cb20: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
cb30: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
cb40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
cb50: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
cb60: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
cb70: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
cb80: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
cb90: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
cba0: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
cbb0: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
cbc0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
cbd0: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
cbe0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cbf0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
cc00: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
cc10: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
cc20: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
cc30: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
cc40: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cc50: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
cc60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
cc70: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
cc80: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
cc90: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
cca0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ccb0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
ccc0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
ccd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
cce0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ccf0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cd00: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
cd10: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
cd20: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
cd30: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
cd40: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
cd50: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
cd60: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
cd70: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
cd80: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
cd90: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
cda0: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
cdb0: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
cdc0: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
cdd0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
cde0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
cdf0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
ce00: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
ce10: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
ce20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
ce30: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
ce40: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
ce50: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
ce60: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
ce70: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
ce80: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
ce90: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
cea0: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
ceb0: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
cec0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
ced0: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
cee0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
cef0: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
cf00: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
cf10: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
cf20: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
cf30: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
cf40: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
cf50: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
cf60: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
cf70: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
cf80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
cf90: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
cfa0: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
cfb0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
cfc0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
cfd0: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
cfe0: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
cff0: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
d000: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
d010: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
d020: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
d030: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
d040: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
d050: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
d060: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
d070: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
d080: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
d090: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
d0a0: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
d0b0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
d0c0: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
d0d0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
d0e0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
d0f0: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
d100: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
d110: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
d120: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
d130: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
d140: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
d150: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
d160: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
d170: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
d180: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
d190: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
d1a0: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
d1b0: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
d1c0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
d1d0: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
d1e0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
d1f0: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
d200: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
d210: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
d220: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
d230: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
d240: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
d250: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
d260: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
d270: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
d280: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
d290: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
d2a0: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
d2b0: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
d2c0: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
d2d0: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
d2e0: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
d2f0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d300: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
d310: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d320: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
d330: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
d340: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d350: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
d360: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
d370: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
d380: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
d390: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
d3a0: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
d3b0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
d3c0: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
d3d0: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
d3e0: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
d3f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
d400: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
d410: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
d420: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
d430: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
d440: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
d450: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
d460: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d470: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
d480: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
d490: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
d4a0: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
d4b0: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
d4c0: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
d4d0: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
d4e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
d4f0: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
d500: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
d510: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
d520: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d530: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
d540: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
d550: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
d560: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
d570: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
d580: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
d590: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
d5a0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
d5b0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
d5c0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
d5d0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
d5e0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
d5f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
d600: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
d610: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
d620: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
d630: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
d640: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d650: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d660: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d670: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
d680: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
d690: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
d6a0: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
d6b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
d6c0: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
d6d0: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
d6e0: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
d6f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
d700: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
d710: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
d720: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
d730: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
d740: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
d750: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
d760: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
d770: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
d780: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
d790: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
d7a0: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
d7b0: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
d7c0: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
d7d0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
d7e0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
d7f0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
d800: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
d810: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
d820: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
d830: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d840: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
d850: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
d860: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
d870: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
d880: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
d890: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
d8a0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
d8b0: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
d8c0: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
d8d0: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
d8e0: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
d8f0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d900: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
d910: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
d920: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
d930: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
d940: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
d950: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
d960: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
d970: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
d980: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
d990: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
d9a0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
d9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d9c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
d9d0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
da00: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
da10: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
da20: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
da30: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
da40: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
da50: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
da60: 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
da70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
da80: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
da90: 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
daa0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
dab0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
dac0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
dad0: 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
dae0: 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
daf0: 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
db00: 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
db10: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
db20: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
db30: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
db40: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
db50: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
db60: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
db70: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
db80: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
db90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dba0: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
dbb0: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
dbc0: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
dbd0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
dbe0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
dbf0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
dc00: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
dc10: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
dc20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
dc30: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
dc40: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
dc50: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
dc60: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
dc70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
dc80: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
dc90: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
dca0: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
dcb0: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
dcc0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
dcd0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
dce0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
dcf0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
dd00: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
dd10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dd20: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
dd30: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
dd40: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
dd50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
dd60: 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
dd70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
dd80: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
dd90: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
dda0: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
ddb0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
ddc0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
ddd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
dde0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
ddf0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
de00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
de10: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
de20: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
de30: 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
de40: 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
de50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
de60: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
de70: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
de80: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
de90: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
dea0: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
deb0: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
dec0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
ded0: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
dee0: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
def0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
df00: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
df10: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
df20: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
df30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
df40: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
df50: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
df60: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
df70: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
df80: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
df90: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
dfa0: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
dfb0: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
dfc0: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
dfd0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
dfe0: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
dff0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
e000: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
e010: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e020: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
e030: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
e040: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
e050: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
e060: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e070: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
e080: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
e090: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
e0a0: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
e0b0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
e0c0: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
e0d0: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
e0e0: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
e0f0: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
e100: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
e110: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
e120: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
e130: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
e140: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
e150: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
e160: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
e170: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
e180: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
e190: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e1a0: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
e1b0: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
e1c0: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
e1d0: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
e1e0: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
e1f0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
e200: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
e210: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
e220: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
e230: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
e240: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
e250: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
e260: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
e270: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
e280: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
e290: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
e2a0: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
e2b0: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
e2c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
e2d0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
e2e0: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
e2f0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e300: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
e310: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
e320: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
e330: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e340: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
e350: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
e360: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
e370: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
e380: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
e390: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
e3a0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
e3b0: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
e3c0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
e3d0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
e3e0: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
e3f0: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
e400: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
e410: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
e420: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
e430: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
e440: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
e450: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
e460: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
e470: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
e480: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
e490: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
e4a0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
e4b0: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
e4c0: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
e4d0: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
e4e0: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
e4f0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
e500: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
e510: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
e520: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e530: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
e540: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
e550: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
e560: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
e570: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
e580: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
e590: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
e5a0: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
e5b0: 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
e5c0: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
e5d0: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
e5e0: 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
e5f0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
e600: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
e610: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
e620: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
e630: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
e640: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
e650: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
e660: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
e670: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
e680: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
e690: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
e6a0: 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
e6b0: 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
e6c0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
e6d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
e6e0: 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
e6f0: 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
e700: 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
e710: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
e720: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
e730: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
e740: 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
e750: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
e760: 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
e770: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
e780: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
e790: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
e7a0: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
e7b0: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
e7c0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
e7d0: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
e7e0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
e7f0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
e800: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
e810: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
e820: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
e830: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
e840: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
e850: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
e860: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
e870: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
e880: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
e890: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
e8a0: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
e8b0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e8c0: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
e8d0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
e8e0: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
e8f0: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
e900: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
e910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
e920: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
e930: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
e940: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
e950: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
e960: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
e970: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
e980: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e990: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e9a0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
e9b0: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
e9c0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
e9d0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
e9e0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
e9f0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
ea00: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
ea10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
ea20: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
ea30: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
ea40: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
ea50: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
ea60: 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
ea70: 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
ea80: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
ea90: 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
eaa0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
eab0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
eac0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
ead0: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
eae0: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
eaf0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
eb00: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
eb10: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
eb20: 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
eb30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
eb40: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
eb50: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
eb60: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
eb70: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
eb80: 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
eb90: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
eba0: 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
ebb0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
ebc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
ebd0: 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
ebe0: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
ebf0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
ec00: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
ec10: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
ec20: 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
ec30: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
ec40: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
ec50: 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
ec60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ec70: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
ec80: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
ec90: 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
eca0: 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
ecb0: 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
ecc0: 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
ecd0: 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
ece0: 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
ecf0: 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
ed00: 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
ed10: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
ed20: 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
ed30: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
ed40: 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
ed50: 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
ed60: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
ed70: 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
ed80: 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
ed90: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
eda0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
edb0: 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
edc0: 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
edd0: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
ede0: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
edf0: 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
ee00: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
ee10: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
ee20: 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
ee30: 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
ee40: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
ee50: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
ee60: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
ee70: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
ee80: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
ee90: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
eea0: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
eeb0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
eec0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eed0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
eee0: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
eef0: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
ef00: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
ef10: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ef20: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
ef30: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
ef40: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
ef50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
ef60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ef70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
ef80: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ef90: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
efa0: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
efb0: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
efc0: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
efd0: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
efe0: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
eff0: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
f000: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
f010: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
f020: 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
f030: 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
f040: 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
f050: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
f060: 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
f070: 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
f080: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
f090: 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
f0a0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
f0b0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
f0c0: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
f0d0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
f0e0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
f0f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f100: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
f110: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
f120: 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
f130: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
f140: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
f150: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
f160: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f170: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
f180: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f190: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
f1a0: 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
f1b0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
f1c0: 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
f1d0: 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  e, zFilename, sq
f1e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
f1f0: 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  ilename)+1);.   
f200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f210: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f220: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
f230: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
f270: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f280: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
f290: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
f2a0: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
f2b0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
f2c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f2d0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
f2e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
f2f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
f300: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
f310: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
f320: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
f330: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
f340: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
f350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f360: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
f370: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
f380: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
f390: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
f3a0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
f3b0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
f3c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f3d0: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
f3e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
f3f0: 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
f400: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f410: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
f420: 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
f430: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
f440: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
f450: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
f460: 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
f470: 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
f480: 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
f490: 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
f4c0: 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
f4d0: 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
f4e0: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
f4f0: 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
f500: 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
f510: 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
f520: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
f530: 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
f540: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
f550: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
f560: 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
f570: 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f590: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f5a0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f5c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f5d0: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
f5e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f5f0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
f600: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
f610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
f620: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
f630: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f640: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
f650: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
f660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f670: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
f680: 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
f690: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
f6a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f6b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f6c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f6d0: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
f6e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f6f0: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
f700: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
f710: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
f720: 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
f730: 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
f740: 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
f750: 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
f760: 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
f770: 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
f780: 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
f790: 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
f7a0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
f7b0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
f7c0: 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
f7d0: 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
f7e0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
f7f0: 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
f800: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
f810: 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
f820: 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
f830: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
f840: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
f850: 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
f860: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
f870: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
f880: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
f890: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
f8a0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
f8b0: 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
f8c0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
f8d0: 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
f8e0: 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
f8f0: 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
f900: 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
f910: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
f920: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
f930: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
f940: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
f950: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
f960: 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
f970: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
f980: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
f990: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
f9a0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
f9b0: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
f9c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f9d0: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
f9e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f9f0: 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
fa00: 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
fa10: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
fa20: 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
fa30: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
fa40: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
fa50: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
fa60: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
fa70: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
fa80: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
fa90: 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
faa0: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
fab0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
fad0: 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
fae0: 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
faf0: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
fb00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fb10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
fb20: 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
fb30: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
fb40: 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
fb50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
fb60: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
fb70: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
fb80: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
fb90: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
fba0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fbb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fbc0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
fbd0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
fbe0: 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
fbf0: 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
fc00: 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
fc10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fc20: 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
fc30: 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
fc40: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
fc50: 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
fc60: 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
fc70: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
fc80: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
fc90: 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
fca0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
fcb0: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
fcc0: 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
fcd0: 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
fce0: 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
fcf0: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
fd00: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
fd10: 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
fd20: 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
fd30: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
fd40: 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
fd50: 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
fd60: 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
fd70: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
fd80: 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
fd90: 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
fda0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
fdb0: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
fdc0: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
fdd0: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
fde0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
fdf0: 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
fe00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
fe10: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
fe20: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
fe30: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
fe40: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
fe50: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
fe60: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
fe70: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
fe80: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
fe90: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
fea0: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
feb0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
fec0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
fed0: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
fee0: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
fef0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
ff00: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
ff10: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
ff20: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
ff30: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
ff40: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
ff50: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
ff60: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
ff70: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
ff80: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
ff90: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
ffa0: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
ffb0: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
ffc0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
ffd0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
ffe0: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
fff0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
10000 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
10010 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
10020 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
10030 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
10040 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
10050 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
10060 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
10070 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
10080 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
10090 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
100a0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
100b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
100c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
100d0 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
100e0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
100f0 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
10100 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
10110 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
10120 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
10130 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
10140 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
10150 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
10160 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10170 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
10180 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
10190 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
101a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
101b0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
101c0 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
101d0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
101e0 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
101f0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
10200 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
10210 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
10220 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
10230 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
10240 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10250 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
10260 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
10270 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10280 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
10290 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
102a0 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
102b0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
102c0 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
102d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
102e0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
102f0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
10300 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
10310 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
10320 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
10330 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
10340 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
10350 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
10360 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10370 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10380 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
10390 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
103a0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
103b0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
103c0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
103d0 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
103e0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
103f0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
10400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
10410 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
10420 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
10430 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10440 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
10450 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
10460 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
10470 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
10480 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10490 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
104a0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
104b0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
104c0 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
104d0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
104e0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
104f0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
10500 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
10510 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
10520 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
10530 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10540 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
10550 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
10560 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
10570 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10580 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
10590 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
105a0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
105b0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
105c0 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
105d0 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
105e0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
105f0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
10600 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
10610 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
10620 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
10630 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
10640 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
10650 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
10660 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
10670 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
10680 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
10690 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
106a0 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
106b0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
106c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
106d0 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
106e0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
106f0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
10700 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
10710 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
10720 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
10730 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
10740 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
10750 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
10760 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
10770 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
10780 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
10790 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
107a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
107b0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
107c0 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
107d0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
107e0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
107f0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
10800 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
10810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
10820 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
10830 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
10840 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
10850 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10860 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
10870 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
10880 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
10890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
108a0 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
108b0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
108c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
108d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
108e0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
108f0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
10900 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
10910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10920 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
10930 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
10940 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
10950 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
10960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10970 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
10980 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10990 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
109a0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
109b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
109c0 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
109d0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
109e0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
109f0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
10a00 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
10a10 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
10a20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
10a30 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
10a40 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
10a50 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
10a60 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
10a70 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
10a80 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
10a90 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
10aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10ab0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
10ac0 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
10ad0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
10ae0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
10af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10b00 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
10b10 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10b20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
10b30 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
10b40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10b50 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
10b60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
10b80 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
10b90 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
10ba0 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
10bb0 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
10bc0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
10bd0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
10be0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
10bf0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
10c00 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
10c10 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
10c20 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
10c30 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
10c40 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
10c50 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
10c60 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
10c70 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
10c80 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
10c90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
10ca0 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
10cb0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
10cc0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
10cd0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
10ce0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
10cf0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
10d00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10d10 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
10d20 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
10d30 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
10d40 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10d50 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10d60 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
10d70 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
10d80 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
10d90 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
10da0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
10db0 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
10dc0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10dd0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10de0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
10df0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
10e00 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
10e10 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
10e20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
10e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10e40 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
10e50 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
10e60 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
10e70 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
10e80 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
10e90 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
10ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
10eb0 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
10ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10ed0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
10ee0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
10ef0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
10f00 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
10f10 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
10f20 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
10f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10f40 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
10f50 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
10f60 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
10f70 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
10f80 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
10f90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
10fa0 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
10fb0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
10fc0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
10fd0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
10fe0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
10ff0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
11000 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
11010 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
11020 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
11030 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
11040 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
11050 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
11060 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
11070 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
11080 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
11090 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
110a0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
110b0 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
110c0 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
110d0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
110e0 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
110f0 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
11100 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
11110 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
11120 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
11130 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
11140 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
11150 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
11160 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
11170 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
11180 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
11190 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
111a0 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
111b0 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
111c0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
111d0 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
111e0 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
111f0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
11200 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
11210 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
11220 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
11230 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
11240 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
11250 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
11260 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
11270 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
11280 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
11290 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
112a0 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
112b0 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
112c0 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
112d0 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
112e0 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
112f0 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
11300 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
11310 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
11320 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
11330 70 20 73 70 61 63 65 20 68 65 72 65 2e 20 20 2a  p space here.  *
11340 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  /.    if( pBt->p
11350 54 6d 70 53 70 61 63 65 20 29 20 6d 65 6d 73 65  TmpSpace ) memse
11360 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  t(pBt->pTmpSpace
11370 2c 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 4);.  }.}..
11380 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
11390 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
113a0 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
113b0 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
113c0 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
113d0 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
113e0 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
113f0 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
11400 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
11410 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
11420 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
11430 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
11440 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
11450 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
11460 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
11470 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11480 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
11490 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
114a0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
114b0 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
114c0 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
114d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
114e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
114f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11500 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11510 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
11520 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
11530 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
11540 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
11550 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
11560 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
11570 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
11580 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
11590 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
115a0 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
115b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
115c0 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
115d0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
115e0 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
115f0 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
11600 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
11610 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
11620 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
11630 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
11640 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
11650 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
11660 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
11670 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
11680 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11690 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
116a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
116b0 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
116c0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
116d0 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
116e0 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
116f0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
11700 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
11710 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
11720 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
11730 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
11740 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
11750 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
11760 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
11770 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
11780 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
11790 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
117a0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
117b0 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
117c0 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
117d0 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
117e0 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
117f0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
11800 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
11810 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
11820 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
11830 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
11840 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
11850 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11860 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
11870 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
11880 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
11890 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
118a0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
118b0 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
118c0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
118d0 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
118e0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
118f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11900 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
11910 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
11920 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
11930 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
11940 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
11950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11960 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
11970 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
11980 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
11990 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
119a0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
119b0 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
119c0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
119d0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
119e0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
119f0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
11a00 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
11a10 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11a20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11a30 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
11a40 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
11a50 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
11a60 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
11a70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
11a80 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
11a90 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
11aa0 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
11ab0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
11ac0 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
11ad0 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
11ae0 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
11af0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
11b00 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
11b10 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
11b20 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
11b30 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
11b40 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
11b50 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
11b60 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
11b70 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
11b80 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
11b90 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
11ba0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
11bb0 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
11bc0 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
11bd0 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
11be0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
11bf0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
11c00 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
11c10 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
11c20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
11c30 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
11c40 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
11c50 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
11c60 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
11c70 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
11c80 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
11c90 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
11ca0 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
11cb0 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
11cc0 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
11cd0 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
11ce0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
11cf0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
11d00 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
11d10 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
11d20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11d30 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
11d40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11d50 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11d60 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11d70 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
11d80 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
11d90 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11da0 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
11db0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11dc0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11dd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
11de0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
11df0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  IZE>0./*.** Chan
11e00 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
11e10 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
11e20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11e30 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d  that may be.** m
11e40 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f  emory mapped..*/
11e50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11e60 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74  eSetMmapLimit(Bt
11e70 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ree *p, sqlite3_
11e80 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
11e90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11ea0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
11eb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11ec0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11ed0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
11ee0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11f00 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
11f10 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a  Pager, szMmap);.
11f20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11f30 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
11f50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
11f60 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
11f70 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
11f80 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
11f90 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
11fa0 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
11fb0 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
11fc0 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
11fd0 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
11fe0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
11ff0 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
12000 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
12010 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
12020 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
12030 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
12040 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
12050 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
12060 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
12070 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
12080 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
12090 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
120a0 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
120b0 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
120c0 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
120d0 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
120e0 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
120f0 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
12100 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
12110 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
12120 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
12130 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12140 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
12150 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
12160 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73  reeSetPagerFlags
12170 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
12180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12190 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
121a0 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
121b0 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
121c0 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f   pgFlags       /
121d0 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f  * Various PAGER_
121e0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
121f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12200 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
12210 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12220 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
12230 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
12240 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12250 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
12260 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
12270 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71  , pgFlags);.  sq
12280 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12290 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
122a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
122b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
122c0 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
122d0 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
122e0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
122f0 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
12300 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
12310 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
12320 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
12330 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
12340 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
12350 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
12360 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12370 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
12380 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
12390 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
123a0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
123b0 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
123c0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
123d0 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
123e0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
123f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12400 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
12410 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
12420 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12430 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12440 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
12450 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
12460 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
12470 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
12480 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
12490 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
124a0 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
124b0 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
124c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
124d0 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
124e0 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
124f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
12500 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
12510 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
12520 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
12530 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
12540 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
12550 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
12560 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
12570 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
12580 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
12590 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
125a0 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
125b0 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
125c0 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
125d0 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
125e0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
125f0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
12600 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
12610 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
12620 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
12630 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
12640 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
12650 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
12660 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
12670 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
12680 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
12690 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
126a0 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
126b0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
126c0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
126d0 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
126e0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
126f0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
12700 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
12710 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
12720 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
12730 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
12740 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
12750 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
12760 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
12770 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
12780 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12790 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
127a0 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
127b0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
127c0 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
127d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
127e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
127f0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
12800 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
12810 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
12820 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
12830 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12840 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
12850 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
12860 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
12870 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12880 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
12890 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
128a0 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
128b0 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
128c0 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
128d0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
128e0 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
128f0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
12900 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
12910 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
12920 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
12930 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
12940 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
12950 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
12960 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
12970 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
12980 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
12990 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
129a0 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
129b0 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
129c0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
129d0 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
129e0 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
129f0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
12a00 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
12a10 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
12a20 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
12a30 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
12a40 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
12a50 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
12a60 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
12a70 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
12a80 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
12a90 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
12aa0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
12ab0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12ac0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
12ad0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
12ae0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
12af0 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
12b00 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
12b10 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
12b20 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
12b30 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
12b40 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64  geSize;.}..#if d
12b50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
12b60 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
12b70 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
12b80 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  )./*.** This fun
12b90 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
12ba0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
12bb0 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
12bc0 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
12bd0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
12be0 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
12bf0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
12c00 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
12c10 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
12c20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
12c30 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
12c40 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
12c50 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
12c60 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
12c70 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
12c80 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
12c90 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
12ca0 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
12cb0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
12cc0 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
12cd0 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
12ce0 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
12cf0 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
12d00 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
12d10 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
12d20 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
12d30 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
12d40 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
12d50 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
12d60 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
12d70 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
12d80 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
12d90 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
12da0 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
12db0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
12dc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12dd0 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
12de0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  ;.  return p->pB
12df0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12e00 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12e10 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12e20 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c  LITE_HAS_CODEC |
12e30 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  | SQLITE_DEBUG *
12e40 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
12e50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
12e60 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
12e70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12e80 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
12e90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12ea0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
12eb0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
12ec0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
12ed0 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
12ee0 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
12ef0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
12f00 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
12f10 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
12f20 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
12f30 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
12f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12f50 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
12f60 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
12f70 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12f80 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
12f90 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
12fa0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
12fb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12fc0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12fd0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
12fe0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
12ff0 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
13000 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
13010 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
13020 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
13030 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
13040 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
13050 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
13060 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
13070 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
13080 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
13090 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
130a0 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
130b0 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
130c0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
130d0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
130e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
130f0 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
13100 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
13110 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
13120 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
13130 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13140 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
13150 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f  .** Set the BTS_
13160 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c  SECURE_DELETE fl
13170 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ag if newFlag is
13180 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77   0 or 1.  If new
13190 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74  Flag is -1,.** t
131a0 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  hen make no chan
131b0 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ges.  Always ret
131c0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
131d0 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
131e0 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e  DELETE.** settin
131f0 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  g after the chan
13200 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
13210 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
13220 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
13230 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
13240 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
13250 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
13260 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13270 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61  p);.  if( newFla
13280 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
13290 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
132a0 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  ~BTS_SECURE_DELE
132b0 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46  TE;.    if( newF
132c0 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74  lag ) p->pBt->bt
132d0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
132e0 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  CURE_DELETE;.  }
132f0 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d   .  b = (p->pBt-
13300 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
13310 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d  SECURE_DELETE)!=
13320 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
13330 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13340 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn b;.}.#endif 
13350 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
13360 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
13370 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
13380 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
13390 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
133a0 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
133b0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
133c0 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
133d0 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
133e0 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
133f0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
13400 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
13410 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
13420 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
13430 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
13440 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
13450 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
13460 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
13470 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
13480 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
13490 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
134a0 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
134b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
134c0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
134d0 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
134e0 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
134f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13500 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
13510 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
13520 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
13530 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
13540 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13550 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
13560 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
13570 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13580 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
13590 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
135a0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
135b0 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
135c0 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
135d0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
135e0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
135f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
13600 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
13610 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
13620 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
13630 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
13640 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13650 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13660 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
13670 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
13680 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
13690 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
136a0 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
136b0 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
136c0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
136d0 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
136e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
136f0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
13700 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
13710 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13720 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
13730 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
13740 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
13750 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
13760 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13770 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
13780 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
13790 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
137a0 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
137b0 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
137c0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
137d0 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
137e0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
137f0 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
13800 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
13820 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
13830 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
13840 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
13850 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
13860 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
13870 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
13880 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
13890 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
138a0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
138b0 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
138c0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
138d0 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
138e0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
138f0 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
13900 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
13910 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
13920 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
13930 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
13940 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
13950 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
13960 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
13970 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
13980 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
13990 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
139a0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
139b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
139c0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
139d0 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
139e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
139f0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
13a00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
13a10 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
13a20 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
13a30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
13a40 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
13a50 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
13a60 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
13a70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
13a80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13a90 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
13aa0 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
13ab0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13ac0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13ad0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
13ae0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
13af0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13b00 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13b20 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
13b30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13b40 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
13b50 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
13b60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
13b70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
13b80 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
13b90 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
13ba0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
13bb0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
13bc0 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
13bd0 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
13be0 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
13bf0 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
13c00 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
13c10 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
13c20 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
13c30 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
13c40 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
13c50 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
13c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
13c70 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
13c80 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
13c90 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
13ca0 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
13cb0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
13cc0 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
13cd0 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
13ce0 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
13cf0 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
13d00 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
13d10 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
13d20 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
13d30 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
13d40 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
13d50 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
13d60 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
13d70 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
13d80 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
13d90 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
13da0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13db0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
13dc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
13dd0 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
13de0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
13df0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
13e00 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
13e10 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
13e20 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
13e30 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
13e40 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
13e50 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
13e60 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
13e70 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
13e80 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
13e90 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
13ea0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
13eb0 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
13ec0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13ed0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
13ee0 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
13ef0 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
13f00 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
13f10 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
13f20 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
13f30 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
13f40 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
13f50 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
13f60 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
13f70 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
13f80 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
13f90 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
13fa0 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
13fb0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
13fc0 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
13fd0 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
13fe0 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
13ff0 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
14000 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
14010 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
14020 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
14030 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
14040 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
14050 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
14060 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
14070 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
14080 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
14090 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
140a0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
140b0 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
140c0 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
140d0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
140e0 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
140f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14100 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
14110 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
14120 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
14130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14140 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
14150 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
14160 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
14170 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  isOpen==0 ){.   
14180 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
14190 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
141a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
141b0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
141c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
141d0 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  TADB;.    }.#end
141e0 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  if..    /* The m
141f0 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
14200 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
14210 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
14220 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
14230 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
14240 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
14250 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
14260 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
14270 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
14280 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
14290 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
142a0 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
142b0 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
142c0 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
142d0 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
142e0 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
142f0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
14300 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
14310 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
14320 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
14330 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
14340 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
14350 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
14360 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
14370 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
14380 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
14390 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
143a0 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
143b0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
143c0 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
143d0 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
143e0 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
143f0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14400 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
14410 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
14420 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
14430 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
14440 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
14450 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
14460 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
14470 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
14480 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
14490 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
144a0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
144b0 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
144c0 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
144d0 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
144e0 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
144f0 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
14500 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
14510 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
14520 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
14530 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
14540 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
14550 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
14560 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
14570 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
14580 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
14590 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
145a0 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
145b0 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
145c0 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
145d0 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
145e0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
145f0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
14600 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
14610 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
14620 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
14630 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
14640 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
14650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14660 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
14670 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
14680 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
146b0 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a  geSize-usableSiz
146c0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
146d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
146e0 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  f( (pBt->db->fla
146f0 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f  gs & SQLITE_Reco
14700 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20  veryMode)==0 && 
14710 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20  nPage>nPageFile 
14720 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
14730 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
14740 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
14750 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14760 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
14770 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b  sableSize<480 ){
14780 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
14790 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
147a0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
147b0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
147c0 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
147d0 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
147e0 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
147f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
14800 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
14810 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
14820 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
14830 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
14840 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
14850 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
14860 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
14870 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
14880 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
14890 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
148a0 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
148b0 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
148c0 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
148d0 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
148e0 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
148f0 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
14900 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
14910 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
14920 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
14930 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
14940 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
14950 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
14960 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
14970 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
14980 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
14990 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
149a0 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
149b0 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
149c0 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
149d0 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
149e0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
149f0 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
14a00 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
14a10 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
14a20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
14a30 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
14a40 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65  te pointer, a he
14a50 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
14a60 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
14a70 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
14a80 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
14a90 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
14aa0 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
14ab0 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
14ac0 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
14ad0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
14ae0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
14af0 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
14b00 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
14b10 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  minLocal = (u16)
14b20 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
14b30 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
14b40 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  3);.  pBt->maxLe
14b50 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  af = (u16)(pBt->
14b60 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29  usableSize - 35)
14b70 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
14b80 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
14b90 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
14ba0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66  /255 - 23);.  if
14bb0 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e  ( pBt->maxLocal>
14bc0 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  127 ){.    pBt->
14bd0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
14be0 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 127;.  }else{.
14bf0 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
14c00 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70  ePayload = (u8)p
14c10 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
14c20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
14c30 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
14c40 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
14c50 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
14c60 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
14c70 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
14c80 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
14c90 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
14ca0 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
14cb0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
14cc0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
14cd0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
14ce0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
14cf0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
14d00 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14d10 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
14d20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72  pBt. This is for
14d30 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
14d40 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
14d50 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
14d60 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
14d70 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
14d80 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ned..**.** Only 
14d90 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
14da0 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f  e counted if wrO
14db0 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66  nly is true.  If
14dc0 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61   wrOnly is.** fa
14dd0 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  lse then all cur
14de0 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
14df0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
14e00 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
14e10 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73   routine, a curs
14e20 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
14e30 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
14e40 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f  ble of reading o
14e50 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  r writing to the
14e60 20 64 61 74 61 62 73 65 2e 20 20 43 75 72 73 6f   databse.  Curso
14e70 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20  rs that.** have 
14e80 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74  been tripped int
14e90 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55  o the CURSOR_FAU
14ea0 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74  LT state are not
14eb0 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61   counted..*/.sta
14ec0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c  tic int countVal
14ed0 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  idCursors(BtShar
14ee0 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f  ed *pBt, int wrO
14ef0 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
14f00 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
14f10 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
14f20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
14f30 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
14f40 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
14f50 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43  wrOnly==0 || (pC
14f60 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
14f70 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d  TCF_WriteFlag)!=
14f80 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  0).     && pCur-
14f90 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
14fa0 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
14fb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
14fc0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
14fd0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
14fe0 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
14ff0 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
15000 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
15010 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
15020 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
15030 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
15040 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
15050 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
15060 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
15070 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
15080 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
15090 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
150a0 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
150b0 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
150c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
150d0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
150e0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
150f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
15100 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
15110 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
15120 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
15130 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
15140 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15150 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
15160 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
15170 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
15180 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20  rs(pBt,0)==0 || 
15190 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
151a0 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
151b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
151c0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
151d0 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
151e0 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61  age1!=0 ){.    a
151f0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
15200 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
15210 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15220 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
15230 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
15240 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
15250 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
15260 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
15270 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
15280 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
15290 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
152a0 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
152b0 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
152c0 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
152d0 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
152e0 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
152f0 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
15300 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
15310 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
15320 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
15330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
15340 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
15350 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
15360 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
15370 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
15380 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
15390 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
153a0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
153b0 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
153c0 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
153d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
153e0 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
153f0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
15400 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
15410 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
15420 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
15430 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
15440 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
15450 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
15460 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
15470 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
15480 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
15490 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
154a0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
154b0 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
154c0 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
154d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
154e0 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
154f0 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
15500 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
15510 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
15520 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
15530 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
15540 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
15550 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
15560 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
15570 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
15580 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
15590 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
155a0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
155b0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
155c0 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
155d0 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
155e0 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
155f0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
15600 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
15610 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
15620 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
15630 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
15640 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
15650 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
15660 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
15670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15680 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
15690 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
156a0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
156b0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
156c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
156d0 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
156e0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
156f0 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
15700 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
15710 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
15720 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
15730 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
15740 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
15750 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
15760 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
15770 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
15780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15790 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
157a0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
157b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
157c0 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
157d0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
157e0 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
157f0 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
15800 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
15810 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
15820 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
15830 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
15840 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
15850 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
15860 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
15870 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
15880 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
15890 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
158a0 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
158b0 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
158c0 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
158d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
158e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
158f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
15900 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
15910 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
15920 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
15930 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
15940 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
15950 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
15960 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
15970 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
15980 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
15990 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
159a0 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
159b0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
159c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
159d0 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
159e0 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
159f0 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
15a00 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
15a10 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
15a20 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
15a30 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
15a40 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
15a50 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
15a60 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
15a70 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
15a80 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
15a90 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
15aa0 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
15ab0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
15ac0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
15ad0 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
15ae0 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
15af0 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
15b00 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
15b10 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
15b20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
15b30 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
15b40 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
15b50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
15b60 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
15b70 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
15b80 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
15b90 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
15ba0 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
15bb0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15bc0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
15bd0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
15be0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
15bf0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
15c00 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
15c10 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
15c20 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
15c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
15c40 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
15c50 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
15c60 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
15c70 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
15c80 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
15c90 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
15ca0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
15cb0 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
15cc0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
15cd0 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
15ce0 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
15cf0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
15d00 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
15d10 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
15d20 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
15d30 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
15d40 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
15d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
15d60 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
15d70 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
15d80 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
15d90 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
15da0 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
15db0 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
15dc0 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
15dd0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
15de0 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
15df0 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
15e00 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
15e10 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
15e20 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
15e30 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
15e40 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
15e50 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
15e60 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
15e70 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
15e80 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
15e90 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
15ea0 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
15eb0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
15ec0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
15ed0 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
15ee0 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
15ef0 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
15f00 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
15f10 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
15f20 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
15f30 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
15f40 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
15f50 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
15f60 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
15f70 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
15f80 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
15f90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
15fa0 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
15fb0 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
15fc0 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
15fd0 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
15fe0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
15ff0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16000 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
16010 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16020 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
16030 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
16040 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
16050 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
16060 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
16070 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
16080 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
16090 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
160a0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
160b0 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
160c0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
160d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
160e0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
160f0 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
16100 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
16110 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
16120 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
16130 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  gun;.  }.  asser
16140 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
16150 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
16160 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41  TE || IfNotOmitA
16170 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
16180 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  te)==0 );..  /* 
16190 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
161a0 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
161b0 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
161c0 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
161d0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
161e0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
161f0 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61  NLY)!=0 && wrfla
16200 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
16210 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
16220 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
16230 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
16240 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
16250 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
16260 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
16270 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
16280 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
16290 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
162a0 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
162b0 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
162c0 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
162d0 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
162e0 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
162f0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
16300 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
16310 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
16320 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
16330 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
16340 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74  RITE).   || (pBt
16350 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
16360 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29  _PENDING)!=0.  )
16370 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70  {.    pBlock = p
16380 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
16390 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66  .  }else if( wrf
163a0 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
163b0 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
163c0 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
163d0 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
163e0 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
163f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
16400 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
16410 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
16420 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
16430 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  db;.        brea
16440 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
16450 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63  .  }.  if( pBloc
16460 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
16470 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
16480 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
16490 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
164a0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
164b0 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ACHE;.    goto t
164c0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
164d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
164e0 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
164f0 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
16500 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
16510 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
16520 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
16530 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
16540 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
16550 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
16560 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
16570 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
16580 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
16590 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
165a0 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
165b0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
165c0 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
165d0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
165e0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
165f0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
16600 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
16610 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
16620 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
16630 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
16640 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
16650 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
16660 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
16670 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
16680 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
16690 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
166a0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
166b0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
166c0 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
166d0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
166e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
166f0 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
16700 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
16710 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
16720 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
16730 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
16740 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
16750 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
16760 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
16770 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
16780 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
16790 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
167a0 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
167b0 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
167c0 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
167d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
167e0 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
167f0 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
16800 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
16810 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
16820 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
16830 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
16840 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
16850 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16860 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
16870 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
16880 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16890 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
168a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
168b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
168c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
168d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
168e0 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
168f0 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
16900 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
16910 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
16920 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16940 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
16950 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
16960 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16970 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
16980 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16990 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
169a0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
169b0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
169c0 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
169d0 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
169e0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
169f0 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
16a00 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
16a10 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
16a20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
16a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16a40 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
16a50 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
16a60 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
16a70 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
16a80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
16a90 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
16aa0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
16ab0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16ac0 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
16ad0 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
16ae0 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
16af0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
16b00 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
16b10 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
16b20 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
16b30 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
16b40 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
16b50 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
16b60 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
16b70 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
16b80 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
16b90 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
16ba0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
16bb0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
16bc0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
16bd0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
16be0 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
16bf0 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
16c00 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
16c10 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
16c20 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
16c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16c40 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
16c50 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
16c60 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
16c70 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
16c80 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
16c90 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
16ca0 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
16cb0 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
16cc0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
16cd0 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
16ce0 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
16cf0 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
16d00 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
16d10 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
16d20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
16d30 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
16d40 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
16d50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
16d60 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
16d70 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
16d80 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
16d90 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
16da0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
16db0 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
16dc0 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
16dd0 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
16de0 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
16df0 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
16e00 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
16e10 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
16e20 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
16e30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
16e40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
16e50 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
16e60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
16e70 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
16e80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16e90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
16ea0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
16eb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
16ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16ed0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
16ee0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
16ef0 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
16f00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16f10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74   }.    }.  }...t
16f20 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
16f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16f40 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
16f50 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
16f60 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
16f70 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
16f80 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
16f90 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
16fa0 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
16fb0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
16fc0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
16fd0 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
16fe0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
16ff0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
17000 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
17010 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
17020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
17030 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
17040 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
17050 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
17060 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
17070 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
17080 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
17090 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
170a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
170b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
170c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
170d0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
170e0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
170f0 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
17100 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
17110 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
17120 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
17130 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
17140 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
17150 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
17160 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
17170 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
17180 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
17190 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
171a0 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
171b0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
171c0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
171f0 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
17200 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17220 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
17230 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
17240 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
17270 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
17280 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
17290 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
172a0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
172b0 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
172c0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
172d0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
172e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
172f0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
17300 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
17310 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
17320 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
17330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
17340 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
17350 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
17360 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
17370 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
17380 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
17390 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
173a0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
173b0 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
173c0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
173d0 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
173e0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
173f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
17400 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
17410 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
17420 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
17430 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
17440 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
17450 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
17460 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
17470 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
17480 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
17490 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
174a0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
174b0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
174c0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
174d0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
174e0 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
174f0 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
17500 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
17510 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
17520 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
17530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17540 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
17550 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
17560 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
17570 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
17580 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
17590 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
175a0 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
175b0 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
175c0 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
175d0 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
175e0 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
175f0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
17600 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
17610 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
17620 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
17630 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
17640 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
17650 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
17660 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
17670 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
17680 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
17690 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
176a0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
176b0 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
176d0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
176e0 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
176f0 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
17700 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
17710 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
17720 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
17730 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
17740 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
17770 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
17780 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
17790 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
177a0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
177b0 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
177c0 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
177d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
177e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
177f0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
17800 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17810 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
17820 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
17830 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
17840 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
17850 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
17860 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
17870 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
17880 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
17890 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
178a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
178b0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
178c0 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
178d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
178e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
178f0 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
17900 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
17910 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
17920 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
17930 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
17940 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
17950 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
17960 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
17970 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  Page);.    nCell
17980 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
17990 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
179a0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
179b0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
179c0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
179d0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
179e0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
179f0 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
17a00 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
17a10 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
17a20 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
17a30 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
17a40 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
17a50 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  .iOverflow.     
17a60 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66      && pCell+inf
17a70 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70  o.iOverflow+3<=p
17a80 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
17a90 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20  e->maskPage.    
17aa0 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67       && iFrom==g
17ab0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
17ac0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a  nfo.iOverflow]).
17ad0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
17ae0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
17af0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
17b00 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
17b10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
17b30 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
17b40 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
17b50 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
17b60 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
17b70 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
17b80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17b90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17ba0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
17bb0 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
17bc0 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
17bd0 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
17be0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
17bf0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
17c00 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
17c10 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
17c20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17c30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
17c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
17c50 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
17c60 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
17c70 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
17c80 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
17c90 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
17ca0 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
17cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17cc0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
17cd0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
17ce0 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
17cf0 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
17d00 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
17d10 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
17d20 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
17d30 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
17d40 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
17d50 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
17d60 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
17d70 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
17d80 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
17d90 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
17da0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
17db0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
17dc0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
17dd0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
17de0 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
17df0 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
17e00 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
17e10 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
17e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17e30 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
17e40 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
17e50 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
17e60 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
17e70 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
17e80 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
17e90 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
17ea0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
17eb0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
17ec0 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
17ed0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
17ee0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
17ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17f00 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
17f10 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
17f20 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
17f30 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
17f40 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
17f50 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
17f60 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
17f70 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
17f80 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
17f90 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
17fa0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17fb0 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
17fc0 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
17fd0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
17fe0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
17ff0 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
18000 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
18010 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
18020 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
18030 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
18040 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
18050 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
18060 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
18070 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
18080 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
18090 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
180a0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
180b0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
180c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
180d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
180e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
180f0 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
18100 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
18110 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
18120 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
18130 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
18140 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
18150 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
18160 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
18170 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
18180 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
18190 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
181a0 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
181b0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
181c0 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
181d0 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
181e0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
181f0 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
18200 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
18210 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
18220 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
18240 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
18250 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
18260 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
18270 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
18280 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
18290 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
182a0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
182b0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
182c0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
182d0 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
182e0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
182f0 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
18300 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
18310 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
18320 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
18330 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
18340 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
18350 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
18360 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
18370 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
18380 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
18390 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
183a0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
183b0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
183c0 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
183d0 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
183e0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
183f0 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
18400 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
18410 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
18420 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
18430 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
18440 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
18450 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
18460 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18470 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18480 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
18490 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
184a0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
184b0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
184c0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
184d0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74  l!=0 ){.      pt
184e0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
184f0 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
18500 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
18510 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ge, &rc);.      
18520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18530 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
18540 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18550 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18560 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
18570 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
18580 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
18590 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
185a0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
185b0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
185c0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
185d0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
185e0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
185f0 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
18600 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
18610 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
18620 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
18630 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
18640 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
18650 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18670 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18680 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
18690 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
186a0 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
186b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
186c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
186d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
186e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
186f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18700 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
18710 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
18720 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
18730 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
18740 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18750 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
18760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18770 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
18780 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
18790 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
187a0 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  ge, &rc);.    }.
187b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
187c0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
187d0 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
187e0 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
187f0 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
18800 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
18810 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
18820 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
18830 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
18840 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
18850 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
18860 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
18870 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
18880 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
18890 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  .** SQLITE_OK. I
188a0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
188b0 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
188c0 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74  erefore no point
188d0 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   in .** calling 
188e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
188f0 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
18900 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66  ITE_DONE. Or, if
18910 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
18920 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d  curs, return som
18930 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
18940 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  de..**.** More s
18950 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
18960 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
18970 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
18980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
18990 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
189a0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
189b0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
189c0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
189d0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
189e0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
189f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18a00 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
18a10 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
18a20 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
18a30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
18a40 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
18a50 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
18a60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
18a70 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
18a80 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
18a90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
18aa0 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
18ab0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
18ac0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
18ad0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
18ae0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
18af0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
18b00 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
18b10 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
18b20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
18b30 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74 20 0a 2a  um-on-commmit .*
18b40 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
18b50 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
18b60 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
18b70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
18b80 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
18b90 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
18ba0 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
18bb0 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
18bc0 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
18bd0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
18be0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
18bf0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
18c00 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
18c10 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
18c20 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18c30 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
18c40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
18c50 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
18c60 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
18c70 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
18c80 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
18c90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18ca0 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
18cb0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
18cc0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
18cd0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
18ce0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18cf0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
18d00 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
18d10 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
18d20 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
18d30 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
18d40 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
18d50 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
18d60 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
18d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18d80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18d90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
18da0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
18db0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
18dc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18dd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18de0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
18df0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
18e00 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
18e10 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
18e20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
18e30 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
18e40 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
18e50 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
18e60 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
18e70 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
18e80 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
18e90 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
18ea0 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
18eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
18ec0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
18ed0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
18ee0 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
18ef0 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
18f00 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
18f10 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
18f20 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
18f30 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
18f40 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
18f50 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
18f60 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
18f70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
18f80 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
18f90 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
18fa0 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
18fb0 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
18fc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18fd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18fe0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18ff0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
19000 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
19010 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
19020 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
19030 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
19040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
19050 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
19060 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
19070 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
19080 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
19090 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
190a0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
190b0 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
190c0 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
190d0 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
190e0 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
190f0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
19100 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
19110 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
19120 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
19130 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
19140 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
19150 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
19160 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
19170 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
19180 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
19190 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
191a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
191b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
191c0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
191d0 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
191e0 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
191f0 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
19200 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
19210 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
19220 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
19230 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
19240 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
19250 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
19260 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
19270 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
19280 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
19290 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
192a0 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
192b0 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
192c0 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
192d0 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
192e0 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
192f0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
19300 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
19310 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
19320 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
19330 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
19340 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
19350 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
19360 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
19370 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
19380 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
19390 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
193a0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
193b0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
193c0 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
193d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
193e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
193f0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
19400 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
19410 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19430 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19440 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
19450 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
19460 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
19470 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19480 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
19490 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
194a0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
194b0 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
194c0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
194d0 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
194e0 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
194f0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
19500 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19520 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19530 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19540 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
19550 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
19560 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
19570 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
19580 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
19590 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
195a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
195b0 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
195c0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
195d0 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
195e0 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
195f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
19600 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19610 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
19620 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
19630 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
19640 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
19650 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
19660 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
19670 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
19680 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
19690 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
196a0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
196b0 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
196c0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
196d0 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
196e0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
196f0 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
19700 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
19710 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
19720 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
19730 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
19740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19750 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
19760 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
19770 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
19780 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
19790 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
197a0 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
197b0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
197c0 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
197f0 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
19800 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
19810 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
19820 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
19830 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
19840 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
19850 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
19860 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
19870 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
19880 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
19890 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
198a0 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
198b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
198c0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
198d0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
198e0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
198f0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
19900 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
19910 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
19920 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
19930 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
19940 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
19950 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
19960 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
19970 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
19980 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
19990 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
199a0 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
199b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
199c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
199d0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
199e0 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
199f0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
19a00 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
19a10 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
19a20 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
19a30 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
19a40 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
19a50 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
19a60 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
19a70 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
19a80 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
19a90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19aa0 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
19ab0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
19ac0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
19ad0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
19ae0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19af0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
19b00 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19b10 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
19b20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
19b30 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
19b40 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
19b50 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
19b60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
19b70 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
19b80 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
19b90 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
19ba0 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
19bb0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
19bc0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
19bd0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
19be0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
19bf0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
19c00 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
19c10 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
19c20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
19c30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
19c40 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
19c50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
19c60 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
19c70 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
19c80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19c90 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
19ca0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
19cb0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
19cc0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
19cd0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
19ce0 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
19cf0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
19d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19d10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19d20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
19d30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
19d40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
19d50 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
19d60 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
19d70 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
19d80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
19d90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19da0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
19db0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
19dc0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19dd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19de0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
19df0 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
19e00 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
19e10 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
19e20 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
19e30 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
19e40 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
19e50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
19e60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
19e70 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
19e80 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
19e90 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
19ea0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
19eb0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
19ec0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
19ed0 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
19ee0 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
19ef0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
19f00 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
19f10 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
19f20 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
19f30 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
19f40 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
19f50 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
19f60 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
19f70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
19f80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
19f90 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
19fa0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
19fb0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
19fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
19fd0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
19fe0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
19ff0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1a000 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1a010 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1a020 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1a030 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
1a040 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
1a050 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
1a060 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
1a070 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
1a080 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1a090 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
1a0a0 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
1a0b0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
1a0c0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
1a0d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1a0e0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
1a0f0 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
1a100 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
1a110 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
1a120 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
1a130 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
1a140 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1a150 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
1a160 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
1a170 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1a180 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1a190 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
1a1a0 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
1a1b0 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
1a1c0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1a1d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
1a1e0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
1a1f0 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
1a200 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
1a210 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
1a220 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
1a230 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1a240 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
1a250 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
1a260 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
1a270 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
1a280 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
1a290 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
1a2a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a2b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1a2c0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
1a2d0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1a2e0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1a2f0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
1a300 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1a310 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1a320 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
1a330 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
1a340 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a350 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
1a360 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
1a370 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1a380 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1a390 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1a3a0 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
1a3b0 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
1a3c0 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
1a3d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
1a3e0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1a3f0 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
1a400 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a410 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1a420 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
1a430 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
1a440 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1a450 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a460 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1a470 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
1a480 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1a490 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
1a4a0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1a4b0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1a4c0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
1a4d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1a4e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1a4f0 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
1a500 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1a510 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
1a520 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
1a530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1a560 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
1a570 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1a580 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
1a590 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1a5a0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1a5b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a5c0 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
1a5d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1a5e0 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
1a5f0 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
1a600 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
1a610 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1a620 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1a630 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1a640 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
1a650 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
1a660 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
1a670 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a680 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
1a690 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
1a6a0 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
1a6b0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
1a6c0 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
1a6d0 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
1a6e0 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
1a6f0 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
1a700 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
1a710 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
1a720 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
1a730 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
1a740 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
1a750 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
1a760 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1a770 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
1a780 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
1a790 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
1a7a0 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
1a7b0 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
1a7c0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
1a7d0 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
1a7e0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1a7f0 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
1a800 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
1a810 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
1a820 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
1a830 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
1a840 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
1a850 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
1a860 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
1a870 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
1a880 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1a890 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
1a8a0 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
1a8b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1a8c0 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
1a8d0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1a8e0 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
1a8f0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
1a900 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
1a910 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
1a920 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1a930 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1a940 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
1a950 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
1a960 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a970 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
1a980 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
1a990 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
1a9a0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1a9b0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1a9c0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1a9d0 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
1a9e0 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
1a9f0 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
1aa00 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
1aa10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1aa20 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
1aa30 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1aa40 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
1aa50 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
1aa60 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
1aa70 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
1aa80 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
1aa90 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
1aaa0 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
1aab0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
1aac0 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
1aad0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
1aae0 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
1aaf0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
1ab00 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
1ab10 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
1ab20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
1ab30 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
1ab40 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1ab50 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1ab60 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
1ab70 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1ab80 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
1ab90 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1aba0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
1abb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1abc0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1abd0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1abe0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1abf0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1ac00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1ac10 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
1ac20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ac30 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1ac40 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1ac50 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
1ac60 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
1ac70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ac80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ac90 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1aca0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1acb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1acc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1acd0 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  if( pBt->bDoTrun
1ace0 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  cate ){.      sq
1acf0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1ad00 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
1ad10 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ger, pBt->nPage)
1ad20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1ad30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ad40 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1ad50 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
1ad60 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
1ad70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1ad80 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1ad90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ada0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1adb0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
1adc0 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
1add0 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
1ade0 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
1adf0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1ae00 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
1ae10 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1ae20 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
1ae30 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
1ae40 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1ae50 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1ae60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
1ae70 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
1ae80 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1ae90 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64  tex(p) );..#ifnd
1aea0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1aeb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d  UTOVACUUM.  pBt-
1aec0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30  >bDoTruncate = 0
1aed0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
1aee0 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1aef0 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62  NONE && db->nVdb
1af00 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f  eRead>1 ){.    /
1af10 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
1af20 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74  ther active stat
1af30 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f  ements that belo
1af40 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ng to this datab
1af50 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c  ase.    ** handl
1af60 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  e, downgrade to 
1af70 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1af80 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68  saction. The oth
1af90 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20  er statements.  
1afa0 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62    ** may still b
1afb0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
1afc0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  he database.  */
1afd0 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
1afe0 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1aff0 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
1b000 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1b010 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
1b020 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
1b030 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
1b040 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
1b050 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
1b060 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
1b070 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1b080 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
1b090 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
1b0a0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
1b0b0 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
1b0c0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1b0d0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1b0e0 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
1b0f0 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
1b100 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
1b110 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
1b120 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
1b130 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
1b140 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1b150 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
1b160 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1b170 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
1b180 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
1b190 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
1b1a0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
1b1b0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
1b1c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1b1d0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1b1e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b1f0 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
1b200 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
1b210 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1b220 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
1b230 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
1b240 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
1b250 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
1b260 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
1b270 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
1b280 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1b290 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
1b2a0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1b2b0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1b2c0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1b2d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1b2e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b2f0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
1b300 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
1b310 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
1b320 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
1b330 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
1b340 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
1b350 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1b360 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
1b370 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1b380 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
1b390 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
1b3a0 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
1b3b0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1b3c0 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
1b3d0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1b3e0 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
1b3f0 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
1b400 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
1b410 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
1b420 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
1b430 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
1b440 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
1b450 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
1b460 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
1b470 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
1b480 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
1b490 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
1b4a0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
1b4b0 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
1b4c0 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
1b4d0 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
1b4e0 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
1b4f0 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
1b500 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
1b510 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
1b520 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1b530 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1b540 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
1b550 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
1b560 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
1b570 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
1b580 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
1b590 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1b5a0 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
1b5b0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
1b5c0 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
1b5d0 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
1b5e0 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
1b5f0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
1b600 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
1b610 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
1b620 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
1b630 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
1b640 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
1b650 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1b660 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1b670 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
1b680 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
1b690 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
1b6a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
1b6b0 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
1b6c0 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
1b6d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
1b6e0 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
1b6f0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
1b700 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
1b710 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
1b720 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
1b730 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
1b740 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
1b750 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
1b760 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
1b770 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
1b780 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
1b790 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
1b7a0 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
1b7b0 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
1b7c0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
1b7d0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1b7e0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1b7f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b800 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1b810 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1b820 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1b830 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1b840 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1b850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b860 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1b870 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
1b880 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
1b890 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1b8a0 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
1b8b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
1b8c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b8d0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1b8e0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1b8f0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1b900 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
1b910 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
1b920 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
1b930 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
1b940 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
1b950 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1b960 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
1b970 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1b980 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1b990 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
1b9a0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1b9b0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1b9c0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1b9d0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1b9e0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
1b9f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
1ba00 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
1ba10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ba20 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1ba30 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
1ba40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ba50 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
1ba60 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
1ba70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ba80 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
1ba90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1baa0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bab0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
1bac0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
1bad0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
1bae0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
1baf0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
1bb00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1bb10 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1bb20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1bb30 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
1bb40 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
1bb50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1bb60 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
1bb70 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1bb80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1bb90 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
1bba0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1bbb0 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
1bbc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bbd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1bbe0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1bbf0 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
1bc00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
1bc10 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1bc20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bc30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bc40 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
1bc50 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
1bc60 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
1bc70 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
1bc80 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
1bc90 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
1bca0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
1bcb0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
1bcc0 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
1bcd0 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
1bce0 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
1bcf0 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
1bd00 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1bd10 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
1bd20 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
1bd30 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
1bd40 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
1bd50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
1bd60 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
1bd70 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1bd80 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
1bd90 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
1bda0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
1bdb0 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
1bdc0 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
1bdd0 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
1bde0 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
1bdf0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
1be00 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1be10 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
1be20 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
1be30 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
1be40 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
1be50 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
1be60 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
1be70 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
1be80 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
1be90 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
1bea0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
1beb0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
1bec0 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
1bed0 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
1bee0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20  ursor *p;.  if( 
1bef0 70 42 74 72 65 65 3d 3d 30 20 29 20 72 65 74 75  pBtree==0 ) retu
1bf00 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rn;.  sqlite3Btr
1bf10 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1bf20 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
1bf30 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1bf40 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1bf50 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71     int i;.    sq
1bf60 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1bf70 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d  ursor(p);.    p-
1bf80 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1bf90 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73  _FAULT;.    p->s
1bfa0 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64  kipNext = errCod
1bfb0 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
1bfc0 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  i<=p->iPage; i++
1bfd0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1bfe0 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69  Page(p->apPage[i
1bff0 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50  ]);.      p->apP
1c000 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  age[i] = 0;.    
1c010 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1c020 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1c030 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
1c040 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
1c050 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1c060 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  .  All cursors w
1c070 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ill be.** invali
1c080 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ded by this oper
1c090 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
1c0a0 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72  mpt to use a cur
1c0b0 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20  sor.** that was 
1c0c0 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
1c0d0 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
1c0e0 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  eration will res
1c0f0 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72  ult.** in an err
1c100 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
1c110 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
1c120 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
1c130 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c140 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
1c150 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
1c160 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
1c170 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
1c180 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
1c190 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
1c1a0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
1c1b0 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ripCode){.  int 
1c1c0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1c1d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1c1e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1c1f0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1c200 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
1c210 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
1c220 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1c230 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
1c240 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1c250 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1c260 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c270 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
1c280 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  pCode ){.    sql
1c290 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
1c2a0 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
1c2b0 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62 74 72 65  ode);.  }.  btre
1c2c0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1c2d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1c2e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1c2f0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
1c300 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
1c310 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
1c320 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
1c330 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
1c340 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
1c350 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
1c360 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
1c370 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1c380 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
1c390 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
1c3a0 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
1c3b0 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
1c3c0 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
1c3d0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
1c3e0 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
1c3f0 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
1c400 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
1c410 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
1c420 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
1c430 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
1c440 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
1c450 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
1c460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1c470 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62  nt nPage = get4b
1c480 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
1c490 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e1->aData);.    
1c4a0 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67    testcase( nPag
1c4b0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
1c4c0 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
1c4d0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1c4e0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1c4f0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74  &nPage);.      t
1c500 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50  estcase( pBt->nP
1c510 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20  age!=nPage );.  
1c520 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1c530 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65   nPage;.      re
1c540 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
1c550 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1c560 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
1c570 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
1c580 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
1c590 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1c5a0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1c5b0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1c5c0 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1c5d0 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1c5e0 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1c5f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1c600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c610 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
1c620 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1c630 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1c640 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63  ransaction can c
1c650 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  an be rolled.** 
1c660 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
1c670 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
1c680 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20  ransaction. You 
1c690 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
1c6a0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66  nsaction .** bef
1c6b0 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
1c6c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
1c6d0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
1c6e0 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
1c6f0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20  atically .** if 
1c700 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
1c710 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20  tion commits or 
1c720 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
1c730 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
1c740 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1c750 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
1c760 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
1c770 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
1c780 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
1c790 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
1c7a0 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
1c7b0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
1c7c0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
1c7d0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
1c7e0 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
1c7f0 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
1c800 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
1c810 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
1c820 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
1c830 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
1c840 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1c850 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75  * A statement su
1c860 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
1c870 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1c880 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  an anonymous sav
1c890 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76  epoint. The.** v
1c8a0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
1c8b0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1c8c0 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ter is the total
1c8d0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
1c8e0 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64  oints,.** includ
1c8f0 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e  ing the new anon
1c900 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c  ymous savepoint,
1c910 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54   open on the B-T
1c920 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  ree. i.e. if the
1c930 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1c940 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
1c950 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74  nd no other stat
1c960 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
1c970 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61  ns open,.** iSta
1c980 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69  tement is 1. Thi
1c990 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  s anonymous save
1c9a0 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c  point can be rel
1c9b0 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  eased or rolled 
1c9c0 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68  back.** using th
1c9d0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  e sqlite3BtreeSa
1c9e0 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69  vepoint() functi
1c9f0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1ca00 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
1ca10 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
1ca20 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e  Statement){.  in
1ca30 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1ca40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1ca50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1ca60 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
1ca70 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1ca80 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1ca90 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73  ssert( (pBt->bts
1caa0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1cab0 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61  _ONLY)==0 );.  a
1cac0 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1cad0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1cae0 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
1caf0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
1cb00 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1cb10 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1cb20 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1cb30 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
1cb40 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
1cb50 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
1cb60 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
1cb70 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  th.  ** an index
1cb80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
1cb90 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
1cba0 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
1cbb0 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73  using.  ** SQL s
1cbc0 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
1cbd0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
1cbe0 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
1cbf0 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73  lback any.  ** s
1cc00 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
1cc10 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
1cc20 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
1cc30 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
1cc40 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ve..  */.  rc = 
1cc50 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1cc60 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1cc70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
1cc80 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
1cc90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1cca0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ccb0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1ccc0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
1ccd0 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
1cce0 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
1ccf0 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
1cd00 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1cd10 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1cd20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
1cd30 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
1cd40 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
1cd50 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
1cd60 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
1cd70 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
1cd80 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
1cd90 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
1cda0 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
1cdb0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1cdc0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
1cdd0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
1cde0 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
1cdf0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
1ce00 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
1ce10 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
1ce20 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
1ce30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1ce40 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1ce50 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
1ce60 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
1ce70 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
1ce80 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
1ce90 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
1cea0 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
1ceb0 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
1cec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
1ced0 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
1cee0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
1cef0 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
1cf00 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
1cf10 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
1cf20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cf30 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
1cf40 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1cf50 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1cf60 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1cf70 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
1cf80 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
1cf90 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
1cfa0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
1cfb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
1cfc0 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
1cfd0 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
1cfe0 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
1cff0 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
1d000 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1d010 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
1d020 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
1d030 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1d040 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
1d050 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1d060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d070 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
1d080 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
1d090 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
1d0a0 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
1d0b0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
1d0c0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
1d0d0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
1d0e0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1d0f0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1d100 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
1d110 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1d120 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
1d130 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1d140 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
1d150 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
1d160 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
1d170 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
1d180 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1d190 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
1d1a0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
1d1b0 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
1d1c0 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
1d1d0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1d1e0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
1d1f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1d200 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1d210 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d220 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
1d230 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
1d240 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
1d250 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
1d260 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
1d270 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
1d280 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
1d290 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
1d2a0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
1d2b0 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
1d2c0 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
1d2d0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
1d2e0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
1d2f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
1d300 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
1d310 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
1d320 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
1d330 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
1d340 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
1d350 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
1d360 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
1d370 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
1d380 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1d390 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
1d3a0 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
1d3b0 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
1d3c0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
1d3d0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
1d3e0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
1d3f0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
1d400 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
1d410 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
1d420 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
1d430 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
1d440 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
1d450 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
1d460 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
1d470 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
1d480 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
1d490 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
1d4a0 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
1d4b0 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
1d4c0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1d4d0 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
1d4e0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
1d4f0 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
1d500 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
1d510 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
1d520 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
1d530 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
1d540 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
1d550 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
1d560 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
1d570 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
1d580 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
1d590 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
1d5a0 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
1d5b0 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
1d5c0 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
1d5d0 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
1d5e0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1d5f0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
1d600 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
1d610 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
1d620 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
1d630 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
1d640 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
1d650 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
1d660 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
1d670 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
1d680 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1d690 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
1d6a0 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
1d6b0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
1d6c0 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
1d6d0 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
1d6e0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
1d6f0 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
1d700 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
1d710 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1d720 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
1d730 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
1d740 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1d750 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
1d760 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
1d770 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
1d780 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1d790 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
1d7a0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
1d7b0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1d7c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d7e0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
1d7f0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
1d820 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
1d830 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
1d840 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d860 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1d870 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1d880 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1d890 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1d8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1d8b0 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
1d8c0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
1d8d0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
1d900 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
1d910 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
1d920 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
1d950 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73   handle */..  as
1d960 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1d970 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1d980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1d990 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
1d9a0 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ==1 );..  /* The
1d9b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1d9c0 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72  t statements ver
1d9d0 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73  ify that if this
1d9e0 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a   is a sharable .
1d9f0 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61    ** b-tree data
1da00 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63  base, the connec
1da10 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
1da20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1da30 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20  le locks, .  ** 
1da40 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  and that no othe
1da50 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
1da60 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
1da70 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
1da80 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20  with .  ** this 
1da90 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
1daa0 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
1dab0 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  heTableLock(p, i
1dac0 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21  Table, pKeyInfo!
1dad0 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b  =0, wrFlag+1) );
1dae0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1daf0 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
1db00 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
1db10 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
1db20 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
1db30 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
1db40 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
1db50 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
1db60 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1db70 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
1db80 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1db90 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
1dba0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1dbb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1dbc0 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
1dbd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
1dbe0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72  ..  if( NEVER(wr
1dbf0 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e 62 74  Flag && (pBt->bt
1dc00 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1dc10 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20  D_ONLY)!=0) ){. 
1dc20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dc30 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
1dc40 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
1dc50 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
1dc60 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
1dc70 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1dc80 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
1dc90 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
1dca0 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
1dcb0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
1dcc0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
1dcd0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
1dce0 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
1dcf0 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
1dd00 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
1dd10 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
1dd20 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
1dd30 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
1dd40 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
1dd50 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
1dd60 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1dd70 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
1dd80 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
1dd90 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73 73 65  Bt = pBt;.  asse
1dda0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1ddb0 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72   wrFlag==BTCF_Wr
1ddc0 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70 43 75  iteFlag );.  pCu
1ddd0 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
1dde0 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e  Flag;.  pCur->pN
1ddf0 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
1de00 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  or;.  if( pCur->
1de10 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
1de20 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1de30 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42  = pCur;.  }.  pB
1de40 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1de50 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
1de60 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1de70 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
1de80 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1de90 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1dea0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1dee0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1df10 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1df20 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1df30 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df60 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1df70 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1df80 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1df90 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1dfa0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1dfb0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
1dfc0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
1dfd0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1e000 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
1e010 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1e020 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1e030 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
1e040 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
1e050 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
1e060 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
1e070 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1e080 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1e090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1e0a0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1e0b0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1e0c0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1e0d0 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
1e0e0 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
1e0f0 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
1e100 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
1e110 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
1e120 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
1e130 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1e140 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1e150 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
1e160 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
1e170 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
1e180 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
1e190 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
1e1a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1e1b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e1c0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1e1d0 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1e1e0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
1e1f0 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
1e200 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
1e210 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
1e220 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1e230 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1e240 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
1e250 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
1e260 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
1e270 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
1e280 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
1e290 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
1e2a0 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
1e2b0 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
1e2c0 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
1e2d0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
1e2e0 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
1e2f0 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
1e300 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
1e310 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
1e320 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
1e330 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1e340 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
1e350 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1e360 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1e370 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
1e380 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
1e390 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
1e3a0 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
1e3b0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1e3c0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
1e3d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1e3e0 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
1e3f0 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
1e400 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
1e410 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
1e420 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
1e430 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
1e440 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
1e450 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
1e460 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
1e470 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
1e480 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1e490 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1e4a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e4b0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1e4c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e4d0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
1e4e0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1e4f0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
1e500 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
1e510 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
1e520 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e530 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
1e540 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1e550 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1e560 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1e570 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1e580 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
1e590 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
1e5a0 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
1e5b0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1e5c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e5d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1e5e0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
1e5f0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1e600 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
1e610 44 62 46 72 65 65 28 70 42 74 72 65 65 2d 3e 64  DbFree(pBtree->d
1e620 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  b, pCur->aOverfl
1e630 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ow);.    /* sqli
1e640 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
1e650 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
1e660 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1e670 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1e680 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e690 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1e6a0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
1e6b0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1e6c0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
1e6d0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
1e6e0 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
1e6f0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
1e700 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
1e710 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
1e720 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
1e730 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1e740 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
1e750 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1e760 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
1e770 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
1e780 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
1e790 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1e7a0 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
1e7b0 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
1e7c0 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
1e7d0 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
1e7e0 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
1e7f0 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
1e800 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1e810 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
1e820 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
1e830 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1e840 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
1e850 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
1e860 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
1e870 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
1e880 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
1e890 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
1e8a0 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
1e8b0 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
1e8c0 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
1e8d0 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1e8e0 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
1e8f0 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
1e900 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
1e910 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
1e920 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
1e930 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
1e940 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
1e950 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
1e960 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
1e970 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1e980 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1e990 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
1e9a0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1e9b0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1e9c0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
1e9d0 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
1e9e0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
1e9f0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1ea00 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1ea10 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
1ea20 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
1ea30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  ;.    assert( CO
1ea40 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63  RRUPT_DB || memc
1ea50 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
1ea60 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
1ea70 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
1ea80 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
1ea90 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
1eaa0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1eab0 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
1eac0 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1ead0 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
1eae0 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
1eaf0 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
1eb00 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
1eb10 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
1eb20 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1eb30 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1eb40 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
1eb50 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1eb60 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
1eb70 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1eb80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1eb90 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1eba0 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1ebb0 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
1ebc0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
1ebd0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
1ebe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1ebf0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1ec00 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
1ec10 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
1ec20 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
1ec30 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
1ec40 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
1ec50 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
1ec60 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
1ec70 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
1ec80 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
1ecd0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1ece0 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69       \.    int i
1ed20 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1ed30 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65        \.    btre
1ed70 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1ed80 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1ed90 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1eda0 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
1edb0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75         \.    pCu
1edc0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
1edd0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20 20  TCF_ValidNKey;  
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee00 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
1ee10 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
1ee60 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1ee70 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
1eeb0 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56  #endif /* _MSC_V
1eec0 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e  ER */..#ifndef N
1eed0 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
1eee0 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
1eef0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1ef00 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1ef10 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
1ef20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
1ef30 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
1ef40 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
1ef50 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
1ef60 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
1ef70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
1ef80 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
1ef90 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
1efa0 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
1efb0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
1efc0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1efd0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1efe0 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
1eff0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1f000 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
1f010 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1f020 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
1f030 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f040 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
1f050 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
1f060 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1f070 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f080 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
1f090 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
1f0a0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
1f0b0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
1f0c0 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
1f0d0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1f0e0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
1f0f0 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
1f100 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
1f110 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
1f120 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
1f130 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
1f140 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1f150 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
1f160 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
1f170 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
1f180 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
1f190 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
1f1a0 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
1f1b0 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
1f1c0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
1f1d0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
1f1e0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
1f1f0 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
1f200 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
1f210 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f220 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
1f230 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
1f240 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
1f250 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f260 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1f270 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f280 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1f290 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1f2a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f2b0 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
1f2c0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
1f2d0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53  VALID ){.    *pS
1f2e0 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
1f2f0 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66  {.    getCellInf
1f300 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53  o(pCur);.    *pS
1f310 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1f320 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74  .nKey;.  }.  ret
1f330 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f340 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1f350 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
1f360 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
1f370 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1f380 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1f390 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1f3a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1f3b0 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
1f3c0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
1f3d0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1f3e0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
1f3f0 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
1f400 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
1f410 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1f420 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
1f430 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
1f440 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
1f450 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f460 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c  ALID..**.** Fail
1f470 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
1f480 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ble.  This funct
1f490 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
1f4a0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1f4b0 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61   It might just a
1f4c0 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63  s well be a proc
1f4d0 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67  edure (returning
1f4e0 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f   void) but we co
1f4f0 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74  ntinue.** to ret
1f500 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  urn an integer r
1f510 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68  esult code for h
1f520 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e  istorical reason
1f530 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1f540 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
1f550 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1f560 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  32 *pSize){.  as
1f570 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f580 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f590 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f5a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f5b0 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
1f5c0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
1f5d0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1f5e0 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75  fo.nData;.  retu
1f5f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f600 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1f610 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1f620 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1f630 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1f640 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
1f650 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
1f660 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
1f670 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1f680 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1f690 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
1f6a0 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
1f6b0 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
1f6c0 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
1f6d0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
1f6e0 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
1f6f0 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
1f700 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1f710 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
1f720 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
1f730 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
1f740 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1f750 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1f760 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
1f770 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1f780 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
1f790 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1f7a0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
1f7b0 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
1f7c0 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
1f7d0 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
1f7e0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
1f7f0 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
1f800 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
1f810 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
1f820 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
1f830 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
1f840 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1f850 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
1f860 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1f870 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
1f880 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
1f890 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
1f8a0 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
1f8b0 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
1f8c0 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
1f8d0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1f8e0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1f8f0 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
1f900 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
1f910 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
1f920 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
1f930 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
1f940 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
1f950 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
1f960 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
1f970 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
1f980 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
1f990 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
1f9a0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1f9b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1f9c0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
1f9d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f9f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
1fa00 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
1fa10 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
1fa20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1fa30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1fa40 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
1fa50 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1fa60 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1fa70 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
1fa80 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
1fa90 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
1faa0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
1fab0 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
1fac0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1fad0 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
1fae0 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
1faf0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
1fb00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fb10 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
1fb20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1fb30 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1fb40 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
1fb50 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
1fb60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fb70 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
1fb80 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
1fb90 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1fba0 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
1fbb0 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
1fbc0 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
1fbd0 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
1fbe0 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
1fbf0 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
1fc00 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
1fc10 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
1fc20 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
1fc30 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
1fc40 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
1fc50 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
1fc60 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
1fc70 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
1fc80 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
1fc90 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
1fca0 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
1fcb0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1fcc0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1fcd0 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
1fce0 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
1fcf0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
1fd00 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
1fd10 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
1fd20 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
1fd30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1fd40 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1fd50 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
1fd60 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
1fd70 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
1fd80 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
1fd90 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1fda0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
1fdb0 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
1fdc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fdd0 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
1fde0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
1fdf0 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
1fe00 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
1fe10 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
1fe20 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1fe30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fe40 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1fe50 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
1fe60 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1fe70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1fe80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1fe90 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1fea0 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
1feb0 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20  , (ppPage==0) ? 
1fec0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
1fed0 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  LY : 0);.    ass
1fee0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1fef0 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
1ff00 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1ff10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ff20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1ff30 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1ff40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1ff50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1ff60 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1ff70 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1ff80 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1ff90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1ffa0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1ffb0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1ffc0 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1ffd0 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1ffe0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1fff0 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
20000 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
20010 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
20020 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
20030 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
20040 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
20050 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
20060 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
20070 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
20080 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
20090 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
200a0 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
200b0 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
200c0 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
200d0 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
200e0 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
200f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20100 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
20110 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
20120 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
20130 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
20140 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
20150 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
20160 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
20170 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
20180 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
20190 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
201a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
201b0 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
201c0 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
201d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
201e0 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
201f0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
20200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20210 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
20220 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
20230 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
20240 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20250 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
20260 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20280 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
20290 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
202a0 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
202b0 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
202c0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
202d0 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
202e0 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
202f0 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
20300 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
20310 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
20320 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
20330 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
20340 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20350 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
20360 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20370 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20380 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
20390 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
203a0 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
203b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
203c0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
203d0 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
203e0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
203f0 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
20400 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
20410 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
20420 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20430 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20440 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
20450 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
20460 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
20470 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
20480 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
20490 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
204a0 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65  inting to. The e
204b0 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  Op.** argument i
204c0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
204d0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
204e0 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69    0: The operati
204f0 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f  on is a read. Po
20500 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
20510 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
20520 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  1: The operation
20530 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70   is a write. Pop
20540 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
20550 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32  ow cache..**   2
20560 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
20570 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f  is a read. Do no
20580 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  t populate the o
20590 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
205a0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
205b0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
205c0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
205d0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
205e0 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
205f0 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
20600 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
20610 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
20620 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
20630 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
20640 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
20650 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
20660 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
20670 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
20680 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
20690 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
206a0 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
206b0 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
206c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e  verflow pages an
206d0 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67  d the.** eOp arg
206e0 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20  ument is not 2, 
206f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
20700 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  y allocate space
20710 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
20720 0a 2a 2a 20 70 6f 70 6c 75 61 74 65 73 20 74 68  .** popluates th
20730 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
20740 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
20750 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
20760 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
20770 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
20780 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
20790 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
207a0 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
207b0 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
207c0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
207d0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
207e0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
207f0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
20800 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
20810 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
20820 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
20830 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
20840 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
20850 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
20860 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
20870 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
20880 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
20890 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
208a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
208b0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
208c0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
208d0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
208e0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
208f0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
20900 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
20910 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
20920 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
20930 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
20940 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
20950 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
20960 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
20970 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
20980 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
20990 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
209a0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
209b0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
209c0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
209d0 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
209e0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
209f0 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
20a00 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
20a10 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
20a20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
20a30 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
20a40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
20a50 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
20a60 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
20a70 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
20a80 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
20a90 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
20aa0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
20ab0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
20ac0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
20ad0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
20ae0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20af0 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
20b00 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
20b10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
20b20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20b30 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
20b40 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
20b50 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
20b60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20b70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
20b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
20b90 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
20ba0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
20bb0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
20bc0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
20bd0 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20  .  int bEnd;    
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c00 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
20c10 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
20c20 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
20c30 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
20c40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
20c50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20c60 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
20c70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20c80 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
20c90 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
20ca0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
20cb0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20cc0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
20cd0 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
20ce0 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74      /* Always st
20cf0 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69  art from beginni
20d00 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f  ng for eOp==2 */
20d10 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
20d20 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
20d30 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
20d40 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
20d50 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
20d60 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
20d70 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
20d80 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
20d90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
20da0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
20db0 41 44 0a 20 20 62 45 6e 64 20 3d 20 28 6f 66 66  AD.  bEnd = (off
20dc0 73 65 74 2b 61 6d 74 3d 3d 6e 4b 65 79 2b 70 43  set+amt==nKey+pC
20dd0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 3b  ur->info.nData);
20de0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 4e  .#endif..  if( N
20df0 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20  EVER(offset+amt 
20e00 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
20e10 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20  o.nData) .   || 
20e20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
20e30 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
20e40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
20e50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
20e60 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
20e70 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
20e80 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
20e90 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
20ea0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
20eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20ec0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
20ed0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
20ee0 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
20ef0 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
20f00 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
20f10 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
20f20 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
20f30 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
20f40 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
20f50 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
20f60 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
20f70 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
20f80 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
20f90 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
20fa0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
20fb0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
20fc0 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28  set], pBuf, a, (
20fd0 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61  eOp & 0x01), pPa
20fe0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
20ff0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
21000 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
21010 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
21020 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
21030 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
21040 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  cal;.  }..  if( 
21050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21060 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
21070 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
21080 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
21090 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
210a0 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
210b0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
210c0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
210d0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
210e0 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
210f0 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
21100 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
21110 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
21120 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
21130 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
21140 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
21150 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  w..    ** Except
21160 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  , do not allocat
21170 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f  e aOverflow[] fo
21180 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a  r eOp==2..    **
21190 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
211a0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
211b0 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
211c0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
211d0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
211e0 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
211f0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
21200 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
21210 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
21220 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
21230 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
21240 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
21250 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
21260 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
21270 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
21280 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
21290 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
212a0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
212b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f     */.    if( eO
212c0 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63  p!=2 && (pCur->c
212d0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
212e0 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
212f0 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
21300 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
21310 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
21320 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
21330 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
21340 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
21350 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
21360 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
21370 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
21380 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
21390 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
213a0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2c 20 70  r->pBtree->db, p
213b0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
213c0 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50  nOvfl*2*sizeof(P
213d0 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
213e0 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
213f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
21400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
21410 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EM;.        }els
21420 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  e{.          pCu
21430 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20  r->nOvflAlloc = 
21440 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20  nOvfl*2;.       
21450 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
21460 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ow = aNew;.     
21470 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
214a0 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
214b0 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
214c0 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
214d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
214e0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
214f0 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
21500 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
21510 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
21520 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
21530 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
21540 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
21550 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
21560 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
21570 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
21580 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
21590 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
215a0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
215b0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
215c0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
215d0 66 6c 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  fl)!=0 && pCur->
215e0 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
215f0 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
21600 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
21610 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
21620 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
21630 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
21640 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
21650 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
21660 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  lSize);.    }.. 
21670 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
21680 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
21690 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
216a0 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a  dx++){..      /*
216b0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
216c0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
216d0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
216e0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
216f0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
21700 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
21710 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)!=0 ){.      
21720 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
21730 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
21740 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
21750 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
21760 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
21770 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
21780 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
21790 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
217a0 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
217b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
217c0 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
217d0 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
217e0 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
217f0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
21800 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
21810 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
21820 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
21830 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
21840 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
21850 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
21860 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
21870 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
21880 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
21890 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
218a0 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
218b0 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
218c0 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
218d0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
218e0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
218f0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
21900 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  at the aOverflow
21910 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65  [] array must be
21920 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75   allocated becau
21930 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20  se eOp!=2.      
21940 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65    ** here.  If e
21950 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73  Op==2, then offs
21960 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62  et==0 and this b
21970 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74  ranch is never t
21980 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aken..        */
21990 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
219a0 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20   eOp!=2 );.     
219b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
219c0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
219d0 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
219e0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
219f0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
21a00 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
21a10 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
21a20 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
21a30 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
21a40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
21a50 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
21a60 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
21a70 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
21a80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21a90 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
21aa0 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
21ab0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
21ac0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
21ad0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
21ae0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
21af0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
21b00 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
21b10 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
21b20 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
21b30 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
21b40 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
21b50 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
21b60 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
21b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
21b80 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20  le *fd;.#endif. 
21b90 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
21ba0 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
21bb0 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
21bc0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
21bd0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
21be0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
21bf0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
21c00 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
21c10 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
21c20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
21c30 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
21c40 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
21c50 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
21c60 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
21c70 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
21c80 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
21c90 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
21ca0 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
21cb0 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
21cc0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
21cd0 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62  *   3) the datab
21ce0 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b  ase is file-back
21cf0 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ed, and.        
21d00 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73  **   4) there is
21d10 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
21d20 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
21d30 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20          **   5) 
21d40 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
21d50 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61  not a WAL databa
21d60 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  se,.        **  
21d70 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f   6) all data fro
21d80 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  m the page is be
21d90 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20  ing read..      
21da0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
21db0 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
21dc0 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
21dd0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
21de0 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
21df0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
21e00 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
21e10 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
21e20 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
21e30 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
21e40 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
21e50 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
21e60 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
21e70 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
21e80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21e90 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d  if( (eOp&0x01)==
21ea0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
21ed0 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
21ee0 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f10 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
21f20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61     && (bEnd || a
21f30 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20  ==ovflSize)     
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f50 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
21f60 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
21f70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21f80 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
21fb0 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
21fc0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
21fd0 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
21fe0 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33  ethods     /* (3
21ff0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
22000 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
22010 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20  ata[19]==0x01   
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22030 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
22040 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
22050 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
22060 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
22070 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
22080 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
22090 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
220a0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
220b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
220c0 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
220d0 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
220e0 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
220f0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
22100 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
22110 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
22120 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
22130 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
22140 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
22150 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
22160 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
22170 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
22180 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22190 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
221a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
221b0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a  Page, &pDbPage,.
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
221d0 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50  eOp&0x01)==0 ? P
221e0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
221f0 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  Y : 0).         
22200 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
22210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
22230 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
22240 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
22250 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
22260 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
22270 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
22280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
22290 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
222a0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
222b0 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  +4], pBuf, a, (e
222c0 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61 67  Op&0x01), pDbPag
222d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
222e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
222f0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
22300 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
22310 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
22320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22330 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
22340 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
22350 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22360 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
22370 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
22380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
22390 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
223a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
223b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
223c0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
223d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
223e0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
223f0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
22400 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
22410 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
22420 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
22430 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
22440 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
22450 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
22460 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
22470 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
22480 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20   a valid row.** 
22490 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
224a0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
224b0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
224c0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
224d0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
224e0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
224f0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
22500 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
22510 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
22520 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
22530 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
22540 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
22550 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
22560 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
22570 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
22580 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
22590 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
225a0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
225b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
225c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
225d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
225e0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
225f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22600 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
22610 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
22620 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
22630 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22640 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
22650 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
22660 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
22670 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
22680 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
22690 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
226a0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
226b0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
226c0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
226d0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
226e0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
226f0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
22700 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
22710 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
22720 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
22730 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
22740 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
22750 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
22760 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
22770 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
22780 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
22790 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
227a0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
227b0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
227c0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
227d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
227e0 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
227f0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
22800 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
22810 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
22820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22830 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
22840 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
22850 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
22860 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22870 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
22880 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
22890 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
228a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
228b0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
228c0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
228d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
228e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
228f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
22900 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
22910 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
22920 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
22930 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22940 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
22950 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
22960 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
22970 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
22980 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
22990 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
229a0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
229b0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
229c0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
229d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
229e0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
229f0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
22a00 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
22a10 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
22a20 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
22a30 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
22a40 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
22a50 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
22a60 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
22a70 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
22a80 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
22a90 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
22aa0 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
22ab0 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
22ac0 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
22ad0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
22ae0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
22af0 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
22b00 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
22b10 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
22b20 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
22b30 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
22b40 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
22b50 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
22b60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
22b70 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
22b80 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
22b90 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
22ba0 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
22bb0 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
22bc0 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
22bd0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
22be0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
22bf0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
22c00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
22c10 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
22c20 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
22c30 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
22c40 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
22c50 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
22c60 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
22c70 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
22c80 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
22c90 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
22ca0 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
22cb0 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
22cc0 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
22cd0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
22ce0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
22cf0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
22d00 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
22d10 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
22d20 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
22d30 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
22d40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
22d50 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
22d60 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
22d70 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
22d80 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
22d90 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
22da0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
22db0 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
22dc0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
22dd0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
22de0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
22df0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
22e00 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
22e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
22e20 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
22e30 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
22e40 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 61  s here */.){.  a
22e50 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
22e60 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
22e70 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
22e80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
22e90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22ea0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22eb0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
22ec0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22ed0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
22ee0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
22ef0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22f00 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
22f10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
22f20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22f30 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
22f40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22f50 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
22f60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
22f70 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 2a 70  .nSize>0 );.  *p
22f80 41 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Amt = pCur->info
22f90 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72  .nLocal;.  retur
22fa0 6e 20 28 76 6f 69 64 2a 29 28 70 43 75 72 2d 3e  n (void*)(pCur->
22fb0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
22fc0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 29  r->info.nHeader)
22fd0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
22fe0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
22ff0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
23000 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
23010 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
23020 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
23030 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
23040 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
23050 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
23060 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
23070 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
23080 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
23090 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
230a0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
230b0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
230c0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
230d0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
230e0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
230f0 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
23100 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
23110 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
23120 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
23130 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
23140 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
23150 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
23160 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
23170 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
23180 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
23190 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
231a0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
231b0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
231c0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
231d0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
231e0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
231f0 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
23200 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
23210 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
23220 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
23230 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
23240 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
23250 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
23260 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
23270 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74  , pAmt);.}.const
23280 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
23290 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
232a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
232b0 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
232c0 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
232d0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
232e0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
232f0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
23300 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
23310 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
23320 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
23330 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
23340 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
23350 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
23360 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
23370 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
23380 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
23390 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
233a0 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
233b0 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
233c0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
233d0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
233e0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
233f0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
23400 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
23410 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
23420 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
23430 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
23440 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
23450 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
23460 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23470 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
23480 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
23490 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
234a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
234b0 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
234c0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
234d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
234e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
234f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23500 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23510 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23520 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
23530 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
23540 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
23550 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23560 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
23570 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
23580 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
23590 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
235a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
235b0 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
235c0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
235d0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
235e0 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  wPage,.         
235f0 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72        (pCur->cur
23600 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
23610 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47  teFlag)==0 ? PAG
23620 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
23630 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  : 0);.  if( rc )
23640 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
23650 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
23660 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
23670 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
23680 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
23690 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
236a0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
236b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
236c0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
236d0 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
236e0 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61  l);.  if( pNewPa
236f0 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
23700 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
23710 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
23720 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
23730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
23740 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
23750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23760 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a  OK;.}..#if 0./*.
23770 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
23780 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
23790 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
237a0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
237b0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
237c0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
237d0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
237e0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
237f0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
23800 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
23810 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
23820 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
23830 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
23840 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
23850 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
23860 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
23870 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
23880 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
23890 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
238a0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
238b0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
238c0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
238d0 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
238e0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
238f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
23900 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
23910 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
23920 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
23930 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
23940 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
23950 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
23960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
23970 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
23980 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
23990 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
239a0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
239b0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
239c0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
239d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
239e0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
239f0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
23a00 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
23a10 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
23a20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
23a30 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
23a40 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
23a50 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
23a60 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
23a70 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
23a80 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
23a90 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
23aa0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
23ab0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
23ac0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
23ad0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
23ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23af0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
23b00 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23b10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23b20 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23b30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23b40 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23b50 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23b60 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23b70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
23b80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23b90 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20  r->iPage] );..  
23ba0 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20 69 73  /* UPDATE: It is
23bb0 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62   actually possib
23bc0 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 64 69  le for the condi
23bd0 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79 20 74  tion tested by t
23be0 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 62  he assert.  ** b
23bf0 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74 72 75  elow to be untru
23c00 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
23c10 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
23c20 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  t. This can occu
23c30 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75  r if.  ** one cu
23c40 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66 69 65  rsor has modifie
23c50 64 20 70 61 67 65 20 70 50 61 72 65 6e 74 20 77  d page pParent w
23c60 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e 63 65  hile a reference
23c70 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64 20 0a   to it is held .
23c80 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e 64    ** by a second
23c90 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68 20 63   cursor. Which c
23ca0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
23cb0 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
23cc0 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69  is linked.  ** i
23cd0 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
23ce0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
23cf0 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  re in a corrupt 
23d00 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69  database.  */.#i
23d10 66 20 30 0a 20 20 61 73 73 65 72 74 50 61 72 65  f 0.  assertPare
23d20 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
23d30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23d40 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
23d50 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23d60 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
23d70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23d80 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
23d90 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65    );.#endif.  te
23da0 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
23db0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
23dc0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
23dd0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
23de0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65  ->nCell );..  re
23df0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
23e00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23e10 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
23e20 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
23e30 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
23e40 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
23e50 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
23e60 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
23e70 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  fl);.}../*.** Mo
23e80 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
23e90 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
23ea0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
23eb0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
23ec0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
23ed0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
23ee0 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
23ef0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
23f00 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
23f10 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
23f20 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
23f30 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
23f40 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
23f50 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
23f60 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
23f70 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
23f80 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
23f90 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
23fa0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
23fb0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
23fc0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
23fd0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
23fe0 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
23ff0 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
24000 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
24010 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
24020 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
24030 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
24040 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
24050 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
24060 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
24070 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
24080 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
24090 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
240a0 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
240b0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
240c0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
240d0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
240e0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
240f0 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
24100 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
24110 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
24120 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
24130 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
24140 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
24150 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
24160 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
24170 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
24180 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
24190 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
241a0 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
241b0 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
241c0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
241d0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
241e0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
241f0 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
24200 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
24210 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
24220 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
24230 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
24240 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
24250 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
24260 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
24270 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
24280 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
24290 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
242a0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
242b0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
242c0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
242d0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
242e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
242f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24300 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24310 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
24320 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
24330 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
24340 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
24350 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
24360 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
24370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
24380 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
24390 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
243a0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
243b0 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
243c0 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
243d0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
243e0 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
243f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
24400 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
24410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
24420 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
24430 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
24440 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
24450 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
24460 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
24470 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
24480 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
24490 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65 61  r->iPage ) relea
244a0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
244b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
244c0 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  -]);.  }else if(
244d0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
244e0 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
244f0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24500 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
24510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
24530 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
24540 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
24550 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
24560 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
24570 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [0],.           
24580 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72        (pCur->cur
24590 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
245a0 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47  teFlag)==0 ? PAG
245b0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
245c0 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
245d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
245e0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
245f0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
24600 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
24610 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
24620 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
24630 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
24640 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
24650 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
24660 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
24670 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Root );..  /* If
24680 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
24690 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
246a0 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
246b0 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
246c0 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74  rsor.  ** expect
246d0 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
246e0 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
246f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
24700 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a  pKeyInfo is.  **
24710 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
24720 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
24730 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
24740 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
24750 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  e,.  ** return a
24760 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
24770 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20   error. .  **.  
24780 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  ** Earlier versi
24790 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73  ons of SQLite as
247a0 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20  sumed that this 
247b0 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66  test could not f
247c0 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  ail.  ** if the 
247d0 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c  root page was al
247e0 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65  ready loaded whe
247f0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24800 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e  was called (i.e.
24810 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69  .  ** if pCur->i
24820 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68  Page>=0). But th
24830 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20  is is not so if 
24840 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
24850 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20  corrupted .  ** 
24860 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68  in such a way th
24870 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73  at page pRoot is
24880 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73   linked into a s
24890 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62  econd b-tree tab
248a0 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65  le .  ** (or the
248b0 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a   freelist).  */.
248c0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
248d0 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52  >intKey==1 || pR
248e0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  oot->intKey==0 )
248f0 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69  ;.  if( pRoot->i
24900 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75  sInit==0 || (pCu
24910 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
24920 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29  =pRoot->intKey )
24930 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
24940 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
24950 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61  ;.  }..  pCur->a
24960 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
24970 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
24980 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
24990 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
249a0 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
249b0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
249c0 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52  Ovfl);..  if( pR
249d0 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
249e0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
249f0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
24a00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
24a10 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
24a20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
24a30 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
24a40 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
24a50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24a60 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
24a70 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
24a80 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
24a90 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
24aa0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
24ab0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
24ac0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
24ad0 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
24ae0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
24af0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24b00 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
24b10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24b20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
24b30 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
24b40 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
24b50 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
24b60 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
24b70 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
24b80 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
24b90 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
24ba0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
24bb0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
24bc0 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
24bd0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
24be0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
24bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
24c00 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
24c10 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24c20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
24c30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24c40 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
24c50 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
24c60 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24c70 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24c80 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
24c90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
24ca0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
24cb0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
24cc0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24cd0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
24ce0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
24cf0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
24d00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
24d10 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
24d20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
24d30 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
24d40 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
24d50 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
24d60 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
24d70 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
24d80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
24da0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
24db0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
24dc0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
24dd0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
24de0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
24df0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24e00 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
24e10 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
24e20 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
24e30 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
24e40 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
24e50 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
24e60 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
24e70 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
24e80 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
24e90 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
24ea0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
24eb0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
24ec0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
24ed0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
24ee0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
24ef0 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
24f00 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
24f10 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
24f20 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
24f30 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
24f40 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
24f50 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
24f60 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
24f70 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
24f80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24f90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
24fa0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
24fb0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24fc0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24fd0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24fe0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24ff0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
25000 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
25010 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
25020 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
25030 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
25040 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
25050 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
25060 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
25070 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
25080 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
25090 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
250a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
250b0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
250c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
250d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
250e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
250f0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
25100 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70  ->nCell-1;.    p
25110 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
25120 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  = 0;.    pCur->c
25130 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
25140 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 7d 0a  _ValidNKey;.  }.
25150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25160 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
25170 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
25180 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
25190 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
251a0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
251b0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
251c0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
251d0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
251e0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
251f0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
25200 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
25210 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
25220 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
25230 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
25240 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
25250 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
25260 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25270 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25280 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25290 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
252a0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
252b0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
252c0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
252d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
252e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
252f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25300 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
25310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25320 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
25330 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
25340 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
25350 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
25360 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
25370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
25380 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
25390 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
253a0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
253b0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
253c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
253d0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
253e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
253f0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
25400 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
25410 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
25420 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
25430 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
25440 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
25450 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
25460 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
25470 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
25480 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
25490 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
254a0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
254b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
254c0 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
254d0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
254e0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
254f0 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
25500 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25510 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25520 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
25530 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
25540 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
25550 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
25560 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
25570 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
25580 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
25590 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
255a0 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
255b0 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
255c0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
255d0 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
255e0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
255f0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
25600 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
25610 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
25620 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
25630 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
25640 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
25650 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
25660 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
25670 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
25680 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
25690 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
256a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
256b0 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
256c0 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
256d0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
256e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
256f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
25700 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25710 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25720 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
25730 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
25740 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
25750 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
25760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25770 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
25780 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
25790 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
257a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
257b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
257c0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
257d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
257e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
257f0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
25800 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
25810 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
25820 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
25830 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
25840 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
25850 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25860 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
25870 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
25880 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
25890 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
258a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
258b0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
258c0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
258d0 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Last;.      }els
258e0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  e{.        pCur-
258f0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
25900 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
25910 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d   }.   .    }.  }
25920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25930 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
25940 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
25950 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
25960 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
25970 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
25980 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
25990 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
259a0 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
259b0 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
259c0 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
259d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
259e0 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
259f0 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
25a00 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
25a10 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
25a20 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
25a30 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
25a40 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
25a50 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
25a60 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
25a70 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
25a80 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
25a90 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
25aa0 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
25ab0 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
25ac0 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
25ad0 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
25ae0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
25af0 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
25b00 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
25b10 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
25b20 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
25b30 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
25b40 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
25b50 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
25b60 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
25b70 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
25b80 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
25b90 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
25ba0 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
25bb0 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
25bc0 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
25bd0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
25be0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
25bf0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
25c00 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
25c10 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
25c20 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
25c30 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
25c40 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
25c50 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
25c60 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
25c70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25c80 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
25c90 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
25ca0 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
25cb0 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
25cc0 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
25cd0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
25ce0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
25cf0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
25d10 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
25d20 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
25d30 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
25d40 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
25d50 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
25d60 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
25d70 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
25d80 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
25d90 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
25da0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  xKey..**.*/.int 
25db0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
25dc0 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
25dd0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
25de0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
25df0 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
25e00 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
25e10 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
25e20 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
25e30 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
25e40 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
25e50 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
25e60 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
25e70 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
25e80 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
25e90 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
25ea0 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
25eb0 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
25ed0 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
25ee0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
25ef0 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
25f00 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
25f10 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
25f20 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25f30 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25f40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25f50 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
25f60 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
25f70 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
25f80 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
25f90 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
25fa0 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
25fb0 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
25fc0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
25fd0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
25fe0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
25ff0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
26000 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
26010 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
26020 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
26030 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
26040 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26050 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43  SOR_VALID && (pC
26060 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
26070 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d  TCF_ValidNKey)!=
26080 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70  0.   && pCur->ap
26090 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
260a0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
260b0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
260c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
260d0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
260e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
260f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26100 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
26110 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
26120 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0 && pCur->info.
26130 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
26140 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
26150 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26160 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
26170 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65   }..  if( pIdxKe
26180 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  y ){.    xRecord
26190 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
261a0 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
261b0 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70  (pIdxKey);.    p
261c0 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72 72 75 70  IdxKey->isCorrup
261d0 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  t = 0;.    asser
261e0 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
261f0 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
26200 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
26210 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
26220 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
26230 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
26240 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
26250 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
26260 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
26270 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
26280 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
26290 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
262a0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
262b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
262c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
262d0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
262e0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
262f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
26300 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26310 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
26320 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26330 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
26340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26350 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26360 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
26370 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26380 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
26390 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
263a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
263b0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
263c0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
263d0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
263e0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
263f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26400 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
26410 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26420 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
26430 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
26440 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c  ge[0]->intKey ||
26450 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
26460 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
26470 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
26480 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
26490 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
264a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
264b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
264c0 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
264f0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
26500 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
26510 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
26520 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
26530 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
26540 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
26550 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
26560 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
26570 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
26580 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
26590 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
265a0 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
265b0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
265c0 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
265d0 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
265e0 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
265f0 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
26600 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
26610 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
26620 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
26630 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
26640 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
26650 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
26660 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
26670 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
26680 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
26690 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
266a0 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
266b0 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
266c0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
266d0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
266e0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
266f0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
26700 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
26710 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
26720 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
26730 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
26740 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
26750 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
26760 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
26770 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
26780 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
26790 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
267a0 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
267b0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
267c0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
267d0 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
267e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
267f0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
26800 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
26810 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
26820 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
26830 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20  l(pPage, idx) + 
26840 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
26850 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
26860 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
26870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
26880 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43  le( 0x80 <= *(pC
26890 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  ell++) ){.      
268a0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e        if( pCell>
268b0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
268c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
268d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
268e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
268f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
26900 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
26910 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
26920 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
26930 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
26940 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
26950 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
26960 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
26970 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
26980 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
26990 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
269a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
269b0 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
269c0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
269d0 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
269e0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
269f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
26a00 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
26a10 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
26a20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
26a30 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
26a40 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  dNKey;.         
26a50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
26a60 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
26a70 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
26a80 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
26a90 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
26aa0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
26ab0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
26ac0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
26ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26ae0 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  o moveto_next_la
26af0 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  yer;.          }
26b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26b10 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
26b20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26b30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
26b40 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
26b50 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
26b60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26b70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
26b80 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
26b90 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
26ba0 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
26bb0 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   = (lwr+upr)/2; 
26bc0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
26bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
26be0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ;;){.        int
26bf0 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   nCell;.        
26c00 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
26c10 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
26c20 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
26c30 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ze;..        /* 
26c40 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
26c50 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
26c60 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
26c70 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
26c80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
26c90 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
26ca0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
26cb0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
26cc0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
26cd0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
26ce0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
26cf0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
26d00 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
26d10 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
26d20 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
26d30 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
26d40 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
26d50 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
26d60 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
26d70 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
26d80 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
26d90 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
26da0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
26db0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
26dc0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
26dd0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
26de0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
26df0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
26e00 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
26e10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26e20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
26e30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
26e40 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
26e50 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
26e60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
26e70 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
26e80 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
26e90 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
26ea0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
26eb0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
26ec0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
26ed0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
26ee0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
26ef0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
26f00 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
26f10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26f20 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
26f30 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
26f40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
26f50 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
26f60 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
26f70 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
26f80 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  y, 0);.        }
26f90 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
26fa0 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
26fb0 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
26fc0 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
26fd0 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
26fe0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
26ff0 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
27000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
27010 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
27020 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
27030 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
27040 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
27050 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
27060 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
27070 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
27080 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27090 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
270a0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
270b0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
270c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
270d0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
270e0 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 2c 20  ll[2], pIdxKey, 
270f0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
27100 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
27110 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
27120 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
27130 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
27140 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
27150 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
27160 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
27170 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
27180 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
27190 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
271a0 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
271b0 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
271c0 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
271d0 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
271e0 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
271f0 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
27200 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
27210 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20  be called. */.  
27220 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
27230 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
27240 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
27250 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
27260 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
27270 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
27280 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
27290 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  r(pPage, pCellBo
272a0 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
272b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
272c0 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
272d0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
272e0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
272f0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
27300 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ell );.         
27310 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
27320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
27340 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
27350 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
27360 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
27370 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
27380 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27390 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
273a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
273b0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
273c0 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
273d0 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
273e0 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  Key, 2);.       
273f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
27400 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27410 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
27420 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
27430 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
27440 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27450 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
27460 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
27470 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
27480 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
27490 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
274a0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
274b0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
274c0 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 69 73 43  rt( pIdxKey->isC
274d0 6f 72 72 75 70 74 3d 3d 30 20 7c 7c 20 63 3d 3d  orrupt==0 || c==
274e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
274f0 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
27500 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
27510 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
27520 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
27530 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
27540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27550 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27560 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
27570 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27580 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27590 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
275a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
275b0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
275c0 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
275d0 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 69 73 43  if( pIdxKey->isC
275e0 6f 72 72 75 70 74 20 29 20 72 63 20 3d 20 53 51  orrupt ) rc = SQ
275f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
27600 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
27610 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
27620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
27630 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
27640 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
27650 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
27660 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
27670 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
27680 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
27690 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
276a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
276b0 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
276c0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
276d0 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
276e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
276f0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
27700 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
27710 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
27720 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
27730 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
27740 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27750 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
27760 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
27770 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
27780 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
27790 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
277a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
277b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
277c0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
277d0 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
277e0 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
277f0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
27800 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
27810 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
27820 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
27830 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
27840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
27850 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
27860 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
27870 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
27880 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
27890 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
278a0 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
278b0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
278c0 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
278d0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
278e0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
278f0 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
27900 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
27910 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
27920 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
27930 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
27940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27950 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
27960 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
27970 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
27980 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
27990 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
279a0 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
279b0 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
279c0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
279d0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
279e0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
279f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
27a00 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
27a10 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
27a20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
27a30 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
27a40 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
27a50 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
27a60 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
27a70 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
27a80 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
27a90 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
27aa0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
27ab0 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
27ac0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
27ad0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
27ae0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
27af0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
27b00 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
27b10 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
27b20 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
27b30 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
27b40 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
27b50 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
27b60 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
27b70 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
27b80 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
27b90 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
27ba0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
27bb0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
27bc0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
27bd0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
27be0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
27bf0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
27c00 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
27c10 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
27c20 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
27c30 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
27c40 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
27c50 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
27c60 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
27c70 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
27c80 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
27c90 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
27ca0 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
27cb0 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
27cc0 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
27cd0 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
27ce0 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
27cf0 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
27d00 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
27d10 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
27d20 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
27d30 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
27d40 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
27d50 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
27d60 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
27d70 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
27d80 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
27d90 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
27da0 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
27db0 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
27dc0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
27dd0 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
27de0 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
27df0 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
27e00 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
27e10 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
27e20 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
27e30 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
27e40 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
27e50 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
27e60 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
27e70 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
27e80 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20  owever.).*/.int 
27e90 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
27ea0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
27eb0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
27ec0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
27ed0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
27ee0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
27ef0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27f00 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27f10 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
27f20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
27f30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
27f40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27f50 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
27f60 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
27f70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69  SOR_VALID );.  i
27f80 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
27f90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
27fa0 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
27fb0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
27fc0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73  r);.    rc = res
27fd0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
27fe0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
27ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28000 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
28010 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
28020 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
28030 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
28040 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
28050 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
28060 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
28070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28080 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
28090 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
280a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
280b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
280c0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
280d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
280e0 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
280f0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28100 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
28110 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
28120 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  Next>0 ){.      
28130 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
28140 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70   = 0;.        *p
28150 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
28160 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28170 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
28180 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
28190 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
281a0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
281b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
281c0 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
281d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
281e0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
281f0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
28200 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
28210 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
28220 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
28230 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
28240 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
28250 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
28260 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
28270 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
28280 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
28290 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
282a0 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
282b0 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
282c0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
282d0 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
282e0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
282f0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
28300 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
28310 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
28320 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
28330 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
28340 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
28350 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
28360 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
28370 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70  e->nCell );..  p
28380 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
28390 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
283a0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
283b0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
283c0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28  alidOvfl);.  if(
283d0 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
283e0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
283f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
28400 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
28410 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
28420 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
28430 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
28440 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
28450 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
28460 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
28470 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
28490 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
284a0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
284b0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
284c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
284d0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
284e0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
284f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
28500 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
28510 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28520 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
28530 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28540 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
28550 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
28560 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
28570 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
28580 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28590 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
285a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
285b0 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
285c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
285d0 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
285e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
285f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
28600 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
28610 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
28620 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
28630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
28640 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
28650 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
28660 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
28670 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
28680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
28690 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
286a0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
286b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
286c0 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
286d0 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
286e0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
286f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
28700 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
28710 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
28720 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
28730 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
28740 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
28750 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
28760 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
28770 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
28780 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
28790 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
287a0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
287b0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
287c0 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
287d0 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
287e0 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
287f0 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
28800 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
28810 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
28820 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
28830 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
28840 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
28850 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
28860 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
28870 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
28880 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
28890 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
288a0 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
288b0 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
288c0 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
288d0 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
288e0 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
288f0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
28900 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
28910 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
28920 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
28930 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
28940 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
28950 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
28960 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
28970 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
28980 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
28990 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
289a0 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
289b0 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
289c0 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
289d0 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
289e0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
289f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
28a00 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
28a10 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
28a20 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
28a30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28a40 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28a50 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
28a60 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
28a70 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
28a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28a90 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
28aa0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
28ab0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
28ac0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28ad0 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
28ae0 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
28af0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
28b00 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
28b10 4c 49 44 20 29 7b 0a 20 20 20 20 69 66 28 20 41  LID ){.    if( A
28b20 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61  LWAYS(pCur->eSta
28b30 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
28b40 52 45 53 45 45 4b 29 20 29 7b 0a 20 20 20 20 20  RESEEK) ){.     
28b50 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
28b60 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
28b70 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
28b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28b90 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
28ba0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
28bb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28bc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
28bd0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
28be0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
28bf0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
28c00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28c10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
28c20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
28c30 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
28c40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28c50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28c60 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
28c70 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
28c80 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
28c90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
28ca0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
28cb0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
28cc0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
28cd0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
28ce0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
28cf0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
28d00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
28d20 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
28d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
28d40 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
28d50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
28d60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28d70 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
28d80 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
28d90 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
28da0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28db0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
28dc0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
28dd0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
28de0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
28df0 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
28e00 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
28e10 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
28e20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28e30 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
28e40 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
28e50 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
28e60 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28e70 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
28e80 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
28e90 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
28ea0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28eb0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
28ec0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
28ed0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
28ee0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
28f00 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
28f10 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
28f20 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
28f30 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
28f40 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
28f50 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
28f60 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 20 20 70 43  idOvfl);..    pC
28f70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28f80 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
28f90 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
28fa0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
28fb0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
28fc0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
28fd0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
28fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
28ff0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
29000 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
29010 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
29020 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
29030 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
29040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29050 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
29060 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
29070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29080 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
29090 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
290a0 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
290b0 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
290c0 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
290d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
290e0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
290f0 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
29100 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
29110 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
29120 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
29130 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
29140 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
29150 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
29160 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
29170 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
29180 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
29190 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
291a0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
291b0 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
291c0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
291d0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
291e0 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
291f0 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
29200 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
29210 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
29220 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
29230 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
29240 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
29250 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
29260 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
29270 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
29280 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
29290 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
292a0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
292b0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
292c0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
292d0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
292e0 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
292f0 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
29300 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
29310 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
29320 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
29330 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
29340 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
29350 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
29360 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
29370 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
29380 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
29390 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
293a0 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
293b0 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
293c0 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
293d0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
293e0 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
293f0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
29400 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
29410 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
29420 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
29430 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
29440 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
29450 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
29460 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
29470 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
29480 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
29490 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
294a0 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
294b0 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
294c0 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
294d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
294e0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
294f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
29500 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
29510 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
29520 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
29530 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
29540 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
29550 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
29560 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
29570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
29580 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
29590 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
295a0 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
295b0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
295c0 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
295d0 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
295e0 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
295f0 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
29600 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
29610 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
29620 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
29630 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
29640 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
29650 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
29660 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
29670 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
29680 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29690 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
296a0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
296b0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
296c0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
296d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
296e0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
296f0 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
29700 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
29710 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29720 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
29730 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29740 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
29750 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
29760 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
29770 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e  (nearby>0 && IfN
29780 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75  otOmitAV(pBt->au
29790 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20  toVacuum)) );.  
297a0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
297b0 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
297c0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
297d0 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34  pBt);.  n = get4
297e0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
297f0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
29800 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
29810 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
29820 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
29830 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29840 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
29850 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
29860 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
29870 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
29880 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
29890 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
298a0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
298b0 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
298c0 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
298d0 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
298e0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
298f0 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
29900 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
29910 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
29920 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
29930 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
29940 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
29950 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
29960 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
29970 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
29980 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
29990 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
299a0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
299b0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
299c0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
299d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
299e0 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64  UUM.    if( eMod
299f0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
29a00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
29a10 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
29a20 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
29a30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
29a40 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
29a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
29a60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
29a70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
29a80 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
29a90 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
29aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
29ab0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29ac0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
29ad0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
29ae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61  ){.          sea
29af0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
29b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29b10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f     }else if( eMo
29b20 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
29b30 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69  {.      searchLi
29b40 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  st = 1;.    }.#e
29b50 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
29b60 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
29b70 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
29b80 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
29b90 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
29ba0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
29bb0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
29bc0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
29bd0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
29be0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
29bf0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29c00 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
29c10 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
29c20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
29c30 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
29c40 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
29c50 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
29c60 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
29c70 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
29c80 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
29c90 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
29ca0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
29cb0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
29cc0 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
29cd0 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
29ce0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
29cf0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
29d00 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
29d10 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
29d20 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
29d30 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
29d40 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
29d50 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
29d60 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
29d70 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
29d80 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
29d90 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
29da0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
29db0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
29dc0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
29dd0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
29de0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
29df0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29e00 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
29e10 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
29e20 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
29e30 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
29e40 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
29e50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
29e60 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29   iTrunk>mxPage )
29e70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
29e80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29e90 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
29ea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
29eb0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29ec0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
29ed0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
29ee0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
29ef0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
29f00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
29f10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
29f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
29f30 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30  ssert( pTrunk!=0
29f40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
29f50 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21  ( pTrunk->aData!
29f60 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d  =0 );..      k =
29f70 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
29f80 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a  k->aData[4]); /*
29f90 20 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20   # of leaves on 
29fa0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
29fb0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  */.      if( k==
29fc0 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
29fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
29fe0 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
29ff0 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
2a000 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
2a010 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
2a020 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
2a030 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
2a040 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
2a050 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
2a060 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
2a070 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
2a080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2a090 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
2a0a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a0b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2a0c0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2a0d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2a0e0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2a0f0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2a100 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2a110 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2a120 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
2a130 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
2a140 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
2a150 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2a160 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
2a170 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2a180 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2a190 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
2a1a0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
2a1b0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
2a1c0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
2a1d0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
2a1e0 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32  }else if( k>(u32
2a1f0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
2a200 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20  e/4 - 2) ){.    
2a210 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
2a220 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  k is out of rang
2a230 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  e.  Database cor
2a240 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
2a250 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2a260 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a270 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2a280 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
2a290 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a2a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2a2b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
2a2c0 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
2a2d0 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d      && (nearby==
2a2e0 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e  iTrunk || (iTrun
2a2f0 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  k<nearby && eMod
2a300 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
2a310 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2a320 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
2a330 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
2a340 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
2a350 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
2a360 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
2a370 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
2a380 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
2a390 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
2a3a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a3b0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
2a3c0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
2a3d0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2a3e0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2a3f0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2a400 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a410 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2a420 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2a430 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2a440 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2a450 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2a460 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
2a470 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2a480 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2a490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
2a4a0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
2a4b0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
2a4c0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2a4d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2a4e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2a4f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2a500 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
2a510 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2a520 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a540 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2a550 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2a560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2a570 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2a580 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
2a590 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
2a5a0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2a5b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a5c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a5d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
2a5e0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
2a5f0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
2a600 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
2a610 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
2a620 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
2a630 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
2a640 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
2a650 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
2a660 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
2a670 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
2a680 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a690 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
2a6a0 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
2a6b0 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
2a6c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2a6d0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
2a6e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
2a6f0 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
2a700 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
2a710 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2a720 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2a730 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2a740 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2a750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a760 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65     testcase( iNe
2a770 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  wTrunk==mxPage )
2a780 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2a790 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2a7a0 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
2a7b0 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
2a7c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2a7d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a7e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2a7f0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2a800 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a810 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a820 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
2a830 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
2a840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2a850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a860 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2a870 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2a880 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2a890 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2a8a0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a8b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a8c0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
2a8d0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
2a8e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2a8f0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
2a900 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
2a910 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
2a920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
2a930 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
2a940 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
2a950 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
2a960 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
2a970 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2a980 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2a990 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2a9a0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2a9b0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2a9c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2a9d0 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
2a9e0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
2a9f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2aa00 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2aa10 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2aa20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2aa30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2aa40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2aa50 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
2aa60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2aa70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2aa80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2aa90 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2aaa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
2aac0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2aad0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
2aae0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2aaf0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ab00 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2ab10 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2ab20 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
2ab30 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
2ab40 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
2ab50 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
2ab60 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
2ab70 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
2ab80 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
2ab90 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
2aba0 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
2abb0 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
2abc0 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
2abd0 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
2abe0 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
2abf0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
2ac00 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
2ac10 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2ac20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
2ac30 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
2ac40 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64          if( eMod
2ac50 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
2ac60 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2ac70 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
2ac80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2ac90 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2aca0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  &aData[8+i*4]);.
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2acc0 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20  ( iPage<=nearby 
2acd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ace0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2ad10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ad20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2ad30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ad40 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
2ad50 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
2ad60 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
2ad70 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
2ad80 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
2ad90 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2ada0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2adc0 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
2add0 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
2ade0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
2adf0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
2ae00 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
2ae10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2ae20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
2ae30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ae40 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
2ae50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ae60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ae70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ae80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ae90 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
2aea0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2aeb0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
2aec0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
2aed0 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
2aee0 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
2aef0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2af00 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
2af10 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
2af20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2af30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2af40 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2af50 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2af60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
2af70 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
2af80 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2af90 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
2afa0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
2afb0 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20  Page==nearby || 
2afc0 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26  (iPage<nearby &&
2afd0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2afe0 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b  LE)) .        ){
2aff0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
2b000 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
2b010 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
2b020 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
2b030 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2b040 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
2b050 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
2b060 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2b070 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
2b080 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
2b0a0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
2b0b0 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
2b0c0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
2b0d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b0e0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2b0f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2b100 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2b110 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2b120 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2b130 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
2b140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b150 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
2b160 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
2b170 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
2b180 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b190 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
2b1a0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2b1b0 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
2b1c0 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
2b1d0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
2b1e0 50 67 6e 6f 29 20 3f 20 50 41 47 45 52 5f 47 45  Pgno) ? PAGER_GE
2b1f0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b  T_NOCONTENT : 0;
2b200 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2b210 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2b220 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
2b230 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
2b240 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2b250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b260 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2b270 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b280 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2b290 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2b2a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b2b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2b2c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2b2d0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
2b2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b2f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
2b300 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
2b310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b320 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b330 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
2b340 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
2b350 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
2b360 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
2b370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2b380 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
2b390 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2b3a0 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e  t, so append a n
2b3b0 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20  ew page to the. 
2b3c0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2b3d0 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mage..    **.   
2b3e0 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65   ** Normally, ne
2b3f0 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65  w pages allocate
2b400 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20  d by this block 
2b410 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64  can be requested
2b420 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
2b430 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
2b440 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
2b450 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69  t' flag set. Thi
2b460 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  s prevents the p
2b470 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  ager.    ** from
2b480 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   trying to read 
2b490 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e  the pages conten
2b4a0 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77  t from disk. How
2b4b0 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20  ever, if the.   
2b4c0 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e   ** current tran
2b4d0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
2b4e0 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d  ady run one or m
2b4f0 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d  ore incremental-
2b500 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74  vacuum.    ** st
2b510 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61  eps, then the pa
2b520 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ge we are about 
2b530 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20  to allocate may 
2b540 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a  contain content.
2b550 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72      ** that is r
2b560 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65  equired in the e
2b570 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
2b580 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
2b590 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  , do.    ** not 
2b5a0 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  set the no-conte
2b5b0 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61  nt flag. This ca
2b5c0 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74  uses the pager t
2b5d0 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e  o load and journ
2b5e0 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  al.    ** the cu
2b5f0 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
2b600 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  nt before overwr
2b610 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
2b620 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
2b630 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  t the pager will
2b640 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74   not actually at
2b650 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72  tempt to load or
2b660 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
2b670 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
2b680 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c   page that reall
2b690 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20  y does lie past 
2b6a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
2b6b0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
2b6c0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20  ile on disk. So 
2b6d0 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64  the effects of d
2b6e0 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d  isabling the no-
2b6f0 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61  content optimiza
2b700 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65  tion.    ** here
2b710 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f   are confined to
2b720 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61   those pages tha
2b730 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68  t lie between th
2b740 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
2b750 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
2b760 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f  ge and the end o
2b770 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2b780 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
2b790 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d  int bNoContent =
2b7a0 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56   (0==IfNotOmitAV
2b7b0 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
2b7c0 65 29 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  e)) ? PAGER_GET_
2b7d0 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a  NOCONTENT : 0;..
2b7e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b7f0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
2b800 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2b810 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2b820 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42  eturn rc;.    pB
2b830 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
2b840 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
2b850 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2b860 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
2b870 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20  age++;..#ifndef 
2b880 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2b890 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2b8a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2b8b0 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
2b8c0 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  pBt, pBt->nPage)
2b8d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2b8e0 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
2b8f0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2b900 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
2b910 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
2b920 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
2b930 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
2b940 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
2b950 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
2b960 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
2b970 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
2b980 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
2b990 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
2b9a0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
2b9b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
2b9c0 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
2b9d0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
2b9e0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
2b9f0 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
2ba00 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
2ba10 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29  n", pBt->nPage))
2ba20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ba30 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44  pBt->nPage!=PEND
2ba40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ba50 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
2ba60 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2ba70 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26  t, pBt->nPage, &
2ba80 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  pPg, bNoContent)
2ba90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2baa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bab0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2bac0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
2bad0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2bae0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2baf0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
2bb00 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2bb10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74  rn rc;.      pBt
2bb20 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
2bb30 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
2bb40 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2bb50 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e  GE(pBt) ){ pBt->
2bb60 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d  nPage++; }.    }
2bb70 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34  .#endif.    put4
2bb80 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70  byte(28 + (u8*)p
2bb90 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
2bba0 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  a, pBt->nPage);.
2bbb0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
2bbc0 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73  ->nPage;..    as
2bbd0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
2bbe0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2bbf0 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
2bc00 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2bc10 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
2bc20 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
2bc30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2bc40 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2bc50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2bc60 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
2bc70 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2bc80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2bc90 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2bca0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2bcb0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
2bcc0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
2bcd0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
2bce0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
2bcf0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
2bd00 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2bd10 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
2bd20 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
2bd30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2bd40 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
2bd50 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
2bd60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2bd70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2bd80 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
2bd90 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
2bda0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
2bdb0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2bdc0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2bdd0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
2bde0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2bdf0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2be00 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
2be10 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
2be20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2be30 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
2be40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
2be50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
2be60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2be70 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d  eable((*ppPage)-
2be80 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
2be90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2bea0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2beb0 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
2bec0 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
2bed0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2bee0 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
2bef0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2bf00 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
2bf10 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
2bf20 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
2bf30 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
2bf40 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
2bf50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2bf60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2bf70 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
2bf80 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
2bf90 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
2bfa0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2bfb0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
2bfc0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2bfd0 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
2bfe0 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
2bff0 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
2c000 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
2c010 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
2c020 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
2c030 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
2c040 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
2c050 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
2c060 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2c070 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
2c080 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
2c090 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
2c0a0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
2c0b0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
2c0c0 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
2c0d0 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
2c0e0 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
2c0f0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
2c100 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
2c110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
2c120 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2c130 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
2c140 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
2c150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2c160 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
2c170 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2c180 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
2c190 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
2c1a0 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
2c1b0 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
2c1c0 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
2c1d0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
2c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1f0 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
2c200 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
2c210 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
2c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c240 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2c250 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
2c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c270 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2c280 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2c290 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
2c2a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2c2b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2c2c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2c2d0 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29  ssert( iPage>1 )
2c2e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
2c2f0 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
2c300 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
2c310 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  ;..  if( pMemPag
2c320 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
2c330 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
2c340 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
2c350 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2c360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2c370 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
2c380 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
2c390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
2c3a0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
2c3b0 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
2c3c0 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
2c3d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c3e0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2c3f0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2c400 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2c410 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
2c420 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2c430 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
2c440 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2c450 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
2c460 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
2c470 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
2c480 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
2c490 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
2c4a0 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
2c4b0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2c4c0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
2c4d0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
2c4e0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
2c4f0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
2c500 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
2c510 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
2c520 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2c530 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
2c540 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
2c550 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
2c560 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c570 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2c580 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
2c590 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2c5a0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2c5b0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
2c5c0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
2c5d0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
2c5e0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
2c5f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
2c600 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
2c610 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
2c620 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
2c630 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
2c640 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
2c650 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
2c660 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
2c670 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
2c680 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
2c690 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
2c6a0 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
2c6b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2c6c0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2c6d0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
2c6e0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
2c6f0 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
2c700 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
2c710 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
2c720 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
2c730 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
2c740 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
2c750 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
2c760 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
2c770 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2c780 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
2c790 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
2c7a0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
2c7b0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
2c7c0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
2c7d0 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
2c7e0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
2c7f0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
2c800 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2c810 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
2c820 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
2c830 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
2c840 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
2c850 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
2c860 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
2c870 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
2c880 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
2c890 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
2c8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2c8b0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2c8c0 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
2c8d0 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
2c8e0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2c8f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2c900 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
2c910 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2c920 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
2c930 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
2c940 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c950 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2c960 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2c970 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
2c980 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2c990 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
2c9a0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2c9b0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
2c9c0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
2c9d0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2c9e0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
2c9f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2ca00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2ca10 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2ca20 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2ca30 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
2ca40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2ca50 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
2ca60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2ca70 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
2ca80 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
2ca90 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
2caa0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
2cab0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
2cac0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
2cad0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2cae0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2caf0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
2cb00 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
2cb10 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
2cb20 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
2cb30 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
2cb40 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
2cb50 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
2cb60 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
2cb70 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
2cb80 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
2cb90 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
2cba0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
2cbb0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
2cbc0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
2cbd0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
2cbe0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
2cbf0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
2cc00 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2cc10 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
2cc20 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
2cc30 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
2cc40 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
2cc50 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
2cc60 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
2cc70 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2cc80 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
2cc90 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
2cca0 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
2ccb0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2ccc0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
2ccd0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
2cce0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
2ccf0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
2cd00 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
2cd10 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
2cd20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
2cd30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
2cd40 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
2cd50 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
2cd60 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
2cd70 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
2cd80 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
2cd90 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
2cda0 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
2cdb0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2cdc0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2cdd0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2cde0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2cdf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ce00 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2ce10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2ce20 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
2ce30 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
2ce40 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
2ce50 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
2ce60 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2ce70 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
2ce80 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
2ce90 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
2cea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2ceb0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
2cec0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2ced0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cee0 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
2cef0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
2cf00 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
2cf10 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
2cf20 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
2cf30 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
2cf40 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
2cf50 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
2cf60 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2cf70 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2cf80 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
2cf90 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
2cfa0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
2cfb0 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
2cfc0 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
2cfd0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
2cfe0 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
2cff0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
2d000 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2d010 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
2d020 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2d030 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2d040 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
2d050 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2d060 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2d070 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
2d080 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
2d090 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
2d0a0 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
2d0b0 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
2d0c0 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
2d0d0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2d0e0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
2d0f0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
2d100 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2d110 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2d120 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
2d130 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
2d140 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2d150 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2d160 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2d170 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2d180 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d190 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
2d1a0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2d1b0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
2d1c0 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
2d1d0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2d1e0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
2d1f0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2d200 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2d210 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
2d220 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2d230 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
2d240 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
2d250 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
2d260 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
2d270 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
2d280 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2d290 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2d2a0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2d2b0 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
2d2c0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2d2d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2d2e0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
2d2f0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
2d300 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
2d310 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
2d320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
2d330 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
2d340 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
2d350 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
2d360 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
2d370 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2d380 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2d390 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
2d3a0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
2d3b0 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
2d3c0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
2d3d0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2d3e0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2d3f0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2d400 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
2d410 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
2d420 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
2d430 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
2d440 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
2d450 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d460 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2d470 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2d480 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2d490 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2d4a0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
2d4b0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2d4c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2d4d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
2d4e0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
2d4f0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
2d500 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
2d510 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
2d520 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
2d530 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61  low+3 > pPage->a
2d540 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
2d550 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
2d560 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2d570 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
2d580 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
2d590 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
2d5a0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
2d5b0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
2d5c0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
2d5d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
2d5e0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
2d5f0 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
2d600 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2d610 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
2d620 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
2d630 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
2d640 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
2d650 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
2d660 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
2d670 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
2d680 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
2d690 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
2d6a0 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
2d6b0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
2d6c0 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
2d6d0 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
2d6e0 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
2d6f0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
2d700 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
2d710 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
2d720 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
2d730 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
2d740 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
2d750 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
2d760 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
2d770 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2d780 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
2d790 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
2d7a0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
2d7b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d7c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2d7d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d7e0 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
2d7f0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
2d800 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
2d810 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
2d820 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2d830 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2d840 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70    }..    if( ( p
2d850 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20  Ovfl || ((pOvfl 
2d860 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
2d870 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29  p(pBt, ovflPgno)
2d880 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20  )!=0) ).     && 
2d890 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2d8a0 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e  Refcount(pOvfl->
2d8b0 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20  pDbPage)!=1.    
2d8c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
2d8d0 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61  e is no reason a
2d8e0 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64  ny cursor should
2d8f0 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e   have an outstan
2d900 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a  ding reference .
2d910 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f        ** to an o
2d920 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c  verflow page bel
2d930 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c  onging to a cell
2d940 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64   that is being d
2d950 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a  eleted/updated..
2d960 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74        ** So if t
2d970 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65  here exists more
2d980 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65   than one refere
2d990 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  nce to this page
2d9a0 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20  , then it .     
2d9b0 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61   ** must not rea
2d9c0 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  lly be an overfl
2d9d0 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  ow page and the 
2d9e0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2d9f0 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20   corrupt. .     
2da00 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75   ** It is helpfu
2da10 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73  l to detect this
2da20 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2da30 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20  freePage2(), as 
2da40 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61  .      ** freePa
2da50 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74  ge2() may zero t
2da60 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
2da70 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74   if secure-delet
2da80 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20  e mode is.      
2da90 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
2daa0 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70  his 'overflow' p
2dab0 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
2dac0 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68  e a page that th
2dad0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65  e.      ** calle
2dae0 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74  r is iterating t
2daf0 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20  hrough or using 
2db00 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61  in some other wa
2db10 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  y, this.      **
2db20 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61   can be problema
2db30 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tic..      */.  
2db40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2db50 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2db60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2db70 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
2db80 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
2db90 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
2dba0 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
2dbb0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2dbc0 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
2dbd0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2dbe0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2dbf0 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
2dc00 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
2dc10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2dc20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2dc30 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
2dc40 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
2dc50 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
2dc60 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
2dc70 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
2dc80 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
2dc90 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
2dca0 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
2dcb0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
2dcc0 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
2dcd0 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
2dce0 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
2dcf0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2dd00 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
2dd10 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
2dd20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
2dd30 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
2dd40 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
2dd50 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
2dd60 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
2dd70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2dd80 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
2dd90 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
2dda0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
2ddb0 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
2ddc0 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
2ddd0 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
2dde0 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
2ddf0 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
2de00 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
2de10 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
2de20 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
2de30 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
2de40 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
2de70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
2de80 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
2de90 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
2dea0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
2deb0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
2dec0 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
2ded0 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
2dee0 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
2def0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
2df00 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
2df10 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
2df20 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  ta */.  int nZer
2df30 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
2df40 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2df50 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70  zero bytes to ap
2df60 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f  pend to pData */
2df70 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
2df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df90 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
2dfa0 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
2dfb0 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
2dfc0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
2dfd0 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
2dfe0 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
2dff0 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
2e000 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
2e010 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
2e020 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
2e030 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
2e040 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e050 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
2e060 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2e070 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
2e080 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
2e090 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43  int nHeader;.  C
2e0a0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
2e0b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e0c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2e0d0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2e0e0 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
2e0f0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
2e100 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65   writeable since
2e110 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20   pCell might be 
2e120 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62  auxiliary.  ** b
2e130 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74  uffer space that
2e140 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f   is separate fro
2e150 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66  m the pPage buff
2e160 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73  er area */.  ass
2e170 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65  ert( pCell<pPage
2e180 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c  ->aData || pCell
2e190 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2e1a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2e1b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2e1c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2e1d0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2e1e0 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Page) );..  /* F
2e1f0 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
2e200 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
2e210 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
2e220 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
2e230 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
2e240 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
2e250 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
2e260 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2e270 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
2e280 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
2e290 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2e2a0 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
2e2b0 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
2e2c0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
2e2d0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
2e2e0 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
2e2f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2e300 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2e310 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
2e320 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
2e330 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
2e340 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
2e350 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
2e360 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75  ( info.nData==(u
2e370 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  32)(nData+nZero)
2e380 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
2e390 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
2e3a0 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
2e3b0 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
2e3c0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2e3d0 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
2e3e0 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
2e3f0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
2e400 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
2e410 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  { .    if( NEVER
2e420 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  (nKey>0x7fffffff
2e430 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a   || pKey==0) ){.
2e440 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e450 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2e460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
2e470 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65  load += (int)nKe
2e480 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
2e490 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
2e4a0 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
2e4b0 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
2e4c0 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
2e4d0 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
2e4e0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
2e4f0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
2e500 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
2e510 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2e520 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
2e530 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
2e540 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
2e550 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2e560 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2e570 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
2e580 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
2e590 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
2e5a0 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
2e5b0 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
2e5c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2e5d0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2e5e0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
2e5f0 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
2e600 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
2e610 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
2e620 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
2e630 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
2e640 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
2e650 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
2e660 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65     );.      }.#e
2e670 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
2e680 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2e690 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
2e6a0 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
2e6b0 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  fl, 0);.#ifndef 
2e6c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2e6d0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
2e6e0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2e6f0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
2e700 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
2e710 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
2e720 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
2e730 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
2e740 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
2e750 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
2e760 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
2e770 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
2e780 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
2e790 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
2e7a0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
2e7b0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
2e7c0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
2e7d0 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
2e7e0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
2e7f0 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
2e800 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
2e810 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
2e820 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
2e830 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
2e840 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
2e850 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
2e860 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
2e870 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
2e880 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
2e890 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73  itialized values
2e8a0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
2e8b0 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
2e8c0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
2e8d0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
2e8e0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2e8f0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63  autoVacuum && rc
2e900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e910 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20         u8 eType 
2e920 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54  = (pgnoPtrmap?PT
2e930 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50  RMAP_OVERFLOW2:P
2e940 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29  TRMAP_OVERFLOW1)
2e950 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
2e960 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
2e970 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
2e980 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20  rmap, &rc);.    
2e990 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2e9a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2e9b0 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
2e9c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
2e9d0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
2e9e0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
2e9f0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2ea00 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
2ea10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2ea20 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54  ..      /* If pT
2ea30 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
2ea40 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72  zero than pPrior
2ea50 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
2ea60 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20   data area.     
2ea70 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
2ea80 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
2ea90 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
2eaa0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
2eab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2eac0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
2ead0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2eae0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
2eaf0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2eb00 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69        /* If pPri
2eb10 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  or is part of th
2eb20 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
2eb30 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
2eb40 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20  sure pPage.     
2eb50 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
2eb60 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  teable */.      
2eb70 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70  assert( pPrior<p
2eb80 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
2eb90 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61  Prior>=&pPage->a
2eba0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
2ebb0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
2ebc0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2ebd0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2ebe0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2ebf0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
2ec00 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
2ec10 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2ec20 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
2ec30 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
2ec40 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
2ec50 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
2ec60 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
2ec70 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
2ec80 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
2ec90 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
2eca0 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
2ecb0 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
2ecc0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
2ecd0 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
2ece0 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
2ecf0 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
2ed00 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a  aceLeft;..    /*
2ed10 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
2ed20 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
2ed30 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20  pPayload points 
2ed40 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
2ed50 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  ea.    ** of pTo
2ed60 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
2ed70 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
2ed80 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2ed90 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
2eda0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
2edb0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2edc0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
2edd0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
2ede0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50  );..    /* If pP
2edf0 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f  ayload is part o
2ee00 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
2ee10 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
2ee20 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
2ee30 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
2ee40 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
2ee50 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64  assert( pPayload
2ee60 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2ee70 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67   pPayload>=&pPag
2ee80 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2ee90 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2eea0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2eeb0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2eec0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2eed0 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  ;..    if( nSrc>
2eee0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
2eef0 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63  >nSrc ) n = nSrc
2ef00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ef10 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65  pSrc );.      me
2ef20 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
2ef30 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
2ef40 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
2ef50 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
2ef60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
2ef70 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
2ef80 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
2ef90 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
2efa0 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
2efb0 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
2efc0 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
2efd0 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
2efe0 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
2eff0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
2f000 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
2f010 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
2f020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f030 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
2f040 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
2f050 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
2f060 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
2f070 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
2f080 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
2f090 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
2f0a0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
2f0b0 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
2f0c0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
2f0d0 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
2f0e0 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
2f0f0 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
2f100 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
2f110 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
2f120 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
2f130 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
2f140 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
2f150 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2f160 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
2f170 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f180 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
2f190 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
2f1a0 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70  , int sz, int *p
2f1b0 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20  RC){.  u32 pc;  
2f1c0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2f1d0 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
2f1e0 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
2f1f0 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
2f200 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
2f210 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
2f220 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
2f230 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
2f240 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
2f250 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
2f260 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2f270 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2f280 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
2f290 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
2f2a0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
2f2b0 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
2f2c0 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
2f2d0 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
2f2e0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
2f2f0 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
2f300 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2f310 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
2f320 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
2f330 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
2f340 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2f350 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2f360 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2f370 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2f380 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2f390 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2f3a0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2f3b0 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
2f3c0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
2f3d0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
2f3e0 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
2f3f0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2f400 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
2f410 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
2f420 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
2f430 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
2f440 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
2f450 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2f460 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
2f470 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2f480 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
2f490 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2f4a0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
2f4b0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
2f4c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
2f4d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
2f4e0 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
2f4f0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
2f500 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
2f510 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2f520 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  n;.  }.  pPage->
2f530 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f  nCell--;.  memmo
2f540 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32  ve(ptr, ptr+2, 2
2f550 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
2f560 20 69 64 78 29 29 3b 0a 20 20 70 75 74 32 62 79   idx));.  put2by
2f570 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2f580 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2f590 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
2f5a0 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 2;.}../*.** In
2f5b0 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
2f5c0 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
2f5d0 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
2f5e0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
2f5f0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
2f600 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
2f610 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2f620 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
2f630 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
2f640 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
2f650 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
2f660 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
2f670 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
2f680 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
2f690 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
2f6a0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
2f6b0 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
2f6c0 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
2f6d0 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
2f6e0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e  age->apOvfl[] an
2f6f0 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
2f700 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
2f710 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
2f720 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
2f730 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
2f740 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
2f750 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
2f760 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
2f770 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
2f780 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
2f790 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
2f7a0 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
2f7b0 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  emented..**.** I
2f7c0 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  f nSkip is non-z
2f7d0 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ero, then do not
2f7e0 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20   copy the first 
2f7f0 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
2f800 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  he.** cell. The 
2f810 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72  caller will over
2f820 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72  write them after
2f830 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2f840 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53  eturns. If.** nS
2f850 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2f860 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20   then pCell may 
2f870 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  not point to an 
2f880 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c  invalid memory l
2f890 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74  ocation .** (but
2f8a0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20   pCell+nSkip is 
2f8b0 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a  always valid)..*
2f8c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
2f8d0 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
2f8e0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
2f8f0 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
2f900 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
2f910 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
2f920 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
2f930 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
2f940 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
2f950 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
2f960 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
2f970 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
2f980 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
2f990 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
2f9a0 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
2f9b0 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
2f9c0 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
2f9d0 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
2f9e0 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
2f9f0 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
2fa00 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
2fa10 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
2fa20 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
2fa30 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
2fa40 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  his value */.  i
2fa50 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20  nt *pRC         
2fa60 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69   /* Read and wri
2fa70 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66  te return code f
2fa80 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  rom here */.){. 
2fa90 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20   int idx = 0;   
2faa0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
2fab0 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
2fac0 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
2fad0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
2fae0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2faf0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2fb00 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
2fb10 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
2fb20 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
2fb30 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
2fb40 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
2fb50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2fb60 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
2fb70 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
2fb80 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
2fb90 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
2fba0 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
2fbb0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
2fbc0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
2fbd0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2fbe0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2fbf0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
2fc00 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  le page */.  int
2fc10 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64   nSkip = (iChild
2fc20 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66   ? 4 : 0);..  if
2fc30 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
2fc40 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
2fc50 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
2fc60 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
2fc70 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
2fc80 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  ( MX_CELL(pPage-
2fc90 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
2fca0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2fcb0 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
2fcc0 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43  pPage->pBt) || C
2fcd0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
2fce0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2fcf0 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
2fd00 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
2fd10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41  ) );.  assert( A
2fd20 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2fd30 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69  apOvfl)==ArraySi
2fd40 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  ze(pPage->aiOvfl
2fd50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2fd60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2fd70 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2fd80 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2fd90 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
2fda0 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
2fdb0 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
2fdc0 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
2fdd0 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
2fde0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2fdf0 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
2fe00 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
2fe10 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
2fe20 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
2fe30 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
2fe40 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
2fe50 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
2fe60 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
2fe70 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
2fe80 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
2fe90 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
2fea0 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
2feb0 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
2fec0 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
2fed0 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
2fee0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
2fef0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2ff00 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2ff10 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
2ff20 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
2ff30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2ff40 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2ff50 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2ff60 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2ff70 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2ff80 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2ff90 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2ffa0 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2ffb0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2ffc0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2ffd0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2ffe0 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2fff0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
30000 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
30010 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
30020 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
30030 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
30040 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
30050 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
30060 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
30070 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
30080 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
30090 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  16)i;.  }else{. 
300a0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
300b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
300c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
300d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
300e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
300f0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
30100 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
30110 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30120 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
30130 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
30140 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
30150 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
30160 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
30170 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
30180 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
30190 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
301a0 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20  >nCell;.    ins 
301b0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
301c0 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  *i;.    rc = all
301d0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
301e0 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
301f0 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
30200 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
30210 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
30220 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
30230 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
30240 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
30250 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
30260 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
30270 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61  success */.    a
30280 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e  ssert( idx >= en
30290 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d+2 );.    asser
302a0 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e  t( idx+sz <= (in
302b0 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
302c0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
302d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
302e0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
302f0 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
30300 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
30310 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
30320 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
30330 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20  nSkip);.    if( 
30340 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
30350 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69  put4byte(&data[i
30360 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  dx], iChild);.  
30370 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28    }.    memmove(
30380 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c 20 26 64  &data[ins+2], &d
30390 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e  ata[ins], end-in
303a0 73 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  s);.    put2byte
303b0 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
303c0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
303d0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
303e0 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
303f0 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  ->nCell);.#ifnde
30400 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30410 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
30420 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
30430 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
30440 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
30450 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
30460 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
30470 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
30480 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
30490 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
304a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
304b0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
304c0 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
304d0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
304e0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
304f0 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
30500 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
30510 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
30520 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
30530 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
30540 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
30550 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
30560 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
30570 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
30580 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
30590 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
305a0 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
305b0 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
305c0 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
305d0 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
305e0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
305f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
30600 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
30610 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
30620 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
30630 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
30640 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
30650 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
30660 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
30670 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
30680 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
30690 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
306a0 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
306b0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
306c0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
306d0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
306e0 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
306f0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
30700 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
30710 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
30720 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
30730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
30740 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
30750 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
30760 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
30770 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
30780 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
30790 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
307a0 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
307b0 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
307c0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
307d0 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
307e0 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
307f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
30800 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
30810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30820 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30830 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
30840 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
30850 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
30860 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28  l<=(int)MX_CELL(
30870 70 50 61 67 65 2d 3e 70 42 74 29 0a 20 20 20 20  pPage->pBt).    
30880 20 20 20 20 20 20 20 20 26 26 20 28 69 6e 74 29          && (int)
30890 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
308a0 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61  Bt)<=10921);.  a
308b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
308c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
308d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
308e0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
308f0 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  at the page has 
30900 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64  just been zeroed
30910 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a   by zeroPage() *
30920 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
30930 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
30940 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
30950 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
30960 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
30970 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
30980 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
30990 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  x[nCell*2];.  ce
309a0 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
309b0 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
309c0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
309d0 20 20 20 75 31 36 20 73 7a 20 3d 20 61 53 69 7a     u16 sz = aSiz
309e0 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70  e[i];.    pCellp
309f0 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c  tr -= 2;.    cel
30a00 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20  lbody -= sz;.   
30a10 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
30a20 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  tr, cellbody);. 
30a30 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
30a40 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
30a50 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20  l[i], sz);.  }. 
30a60 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
30a70 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
30a80 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
30a90 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
30aa0 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
30ab0 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
30ac0 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
30ad0 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
30ae0 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
30af0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
30b00 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
30b10 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
30b20 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
30b30 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
30b40 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
30b50 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
30b60 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
30b70 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
30b80 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
30b90 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
30ba0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
30bb0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
30bc0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
30bd0 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
30be0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
30bf0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
30c00 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
30c10 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
30c20 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
30c30 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
30c40 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
30c50 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
30c60 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
30c70 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
30c80 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
30c90 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
30ca0 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
30cb0 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
30cc0 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
30cd0 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
30ce0 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
30cf0 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
30d00 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
30d10 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
30d20 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
30d30 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
30d40 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
30d50 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
30d60 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
30d70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30d80 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
30d90 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
30da0 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
30db0 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
30dc0 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
30dd0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
30de0 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
30df0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
30e00 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
30e10 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
30e20 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
30e30 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
30e40 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
30e50 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
30e60 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
30e70 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
30e80 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
30e90 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
30ea0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
30eb0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
30ec0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
30ed0 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
30ee0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
30ef0 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
30f00 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20  ying to balance 
30f10 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
30f20 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
30f30 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
30f40 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
30f50 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
30f60 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
30f70 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
30f80 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
30f90 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
30fa0 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
30fb0 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
30fc0 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
30fd0 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
30fe0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
30ff0 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
31000 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
31010 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
31020 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
31030 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
31040 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
31050 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
31060 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
31070 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
31080 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
31090 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
310a0 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
310b0 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
310c0 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
310d0 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
310e0 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
310f0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
31100 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
31110 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53  ge..**.** The pS
31120 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75  pace buffer is u
31130 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74  sed to store a t
31140 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66  emporary copy of
31150 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20   the divider.** 
31160 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62  cell that will b
31170 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
31180 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20  pParent. Such a 
31190 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
311a0 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67   a 4.** byte pag
311b0 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65  e number followe
311c0 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20  d by a variable 
311d0 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20  length integer. 
311e0 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
311f0 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79  s, at most 13 by
31200 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70  tes. Hence the p
31210 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73  Space buffer mus
31220 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74  t be at.** least
31230 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
31240 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
31250 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
31260 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
31270 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
31280 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20   u8 *pSpace){.  
31290 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20  BtShared *const 
312a0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
312b0 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44  ;    /* B-Tree D
312c0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d  atabase */.  Mem
312d0 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Page *pNew;     
312e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312f0 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
31300 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ated page */.  i
31310 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
31320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31330 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
31340 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  de */.  Pgno pgn
31350 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  oNew;           
31360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31370 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  Page number of p
31380 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  New */..  assert
31390 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
313a0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
313b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
313c0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
313d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
313e0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
313f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31400 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
31410 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72  );..  /* This er
31420 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ror condition is
31430 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
31440 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
31450 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
31460 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
31470 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
31480 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31490 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
314a0 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
314b0 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
314c0 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
314d0 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
314e0 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
314f0 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
31500 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
31510 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
31520 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
31530 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
31540 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
31550 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
31560 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
31570 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
31580 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
31590 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
315a0 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
315b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
315c0 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
315d0 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
315e0 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
315f0 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75  apOvfl[0];.    u
31600 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
31610 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
31620 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
31630 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
31640 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
31650 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
31660 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
31670 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
31680 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
31690 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
316a0 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
316b0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
316c0 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
316d0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
316e0 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
316f0 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
31700 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
31710 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
31720 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
31730 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
31740 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
31750 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
31760 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
31770 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
31780 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
31790 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
317a0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
317b0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
317c0 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
317d0 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
317e0 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
317f0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
31800 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
31810 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
31820 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31830 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
31840 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
31850 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
31860 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
31870 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
31880 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
31890 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
318a0 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
318b0 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
318c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
318d0 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
318e0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
318f0 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
31900 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
31910 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
31920 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
31930 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
31940 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
31950 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
31960 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
31970 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
31980 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
31990 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
319a0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
319b0 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
319c0 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
319d0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
319e0 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
319f0 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
31a00 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
31a10 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
31a20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
31a30 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
31a40 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
31a50 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
31a60 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
31a70 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
31a80 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
31a90 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
31aa0 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
31ab0 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
31ac0 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
31ad0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
31ae0 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
31af0 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
31b00 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
31b10 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
31b20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
31b30 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
31b40 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
31b50 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
31b60 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
31b70 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
31b80 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
31b90 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
31ba0 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
31bb0 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
31bc0 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
31bd0 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
31be0 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
31bf0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
31c00 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
31c10 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
31c20 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
31c30 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
31c40 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
31c50 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
31c60 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
31c70 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
31c80 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
31c90 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
31ca0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
31cb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
31cc0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
31cd0 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
31ce0 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
31cf0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
31d00 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
31d10 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
31d20 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
31d30 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
31d40 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
31d50 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
31d60 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
31d70 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
31d80 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
31d90 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
31da0 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
31db0 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
31dc0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
31dd0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
31de0 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
31df0 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
31e00 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
31e10 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
31e20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
31e30 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
31e40 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
31e50 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
31e60 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
31e70 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
31e80 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
31e90 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
31ea0 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
31eb0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
31ec0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
31ed0 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
31ee0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
31ef0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
31f00 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
31f10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
31f20 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
31f30 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
31f40 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
31f50 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
31f60 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
31f70 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
31f80 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
31f90 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
31fa0 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
31fb0 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
31fc0 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
31fd0 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
31fe0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
31ff0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
32000 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
32010 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
32020 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
32030 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
32040 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
32050 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
32060 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
32070 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
32080 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
32090 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
320a0 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
320b0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
320c0 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
320d0 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
320e0 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
320f0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
32100 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
32110 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
32120 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
32130 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
32140 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
32150 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
32160 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
32170 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
32180 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
32190 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
321a0 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
321b0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
321c0 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
321d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
321e0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
321f0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
32200 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
32210 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
32220 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
32230 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
32240 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
32250 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
32260 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
32270 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
32280 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
32290 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
322a0 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
322b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
322c0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
322d0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
322e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
322f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
32300 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
32310 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
32320 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
32330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32340 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
32350 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
32360 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
32370 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
32380 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
32390 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
323a0 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
323b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
323c0 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
323d0 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
323e0 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
323f0 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
32400 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
32410 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
32420 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
32430 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
32440 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
32450 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
32460 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
32470 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
32480 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
32490 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
324a0 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
324b0 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
324c0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
324d0 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
324e0 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
324f0 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
32500 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
32510 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
32520 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
32530 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
32540 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
32550 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
32560 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
32570 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
32580 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d  MemPage.apOvfl[]
32590 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
325a0 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
325b0 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
325c0 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
325d0 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
325e0 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
325f0 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
32600 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
32610 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
32620 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
32630 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
32640 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
32650 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
32660 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
32670 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
32680 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
32690 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
326a0 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
326b0 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
326c0 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
326d0 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43  c void copyNodeC
326e0 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
326f0 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
32700 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  pTo, int *pRC){.
32710 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
32720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42  LITE_OK ){.    B
32730 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
32740 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
32750 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
32760 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
32770 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20  aData;.    u8 * 
32780 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
32790 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  >aData;.    int 
327a0 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
327b0 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
327c0 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  t;.    int const
327d0 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
327e0 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
327f0 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  : 0);.    int rc
32800 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b  ;.    int iData;
32810 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72  .  .  .    asser
32820 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74  t( pFrom->isInit
32830 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32840 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54  pFrom->nFree>=iT
32850 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  oHdr );.    asse
32860 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
32870 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
32880 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
32890 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
328a0 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
328b0 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
328c0 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
328d0 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
328e0 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
328f0 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
32900 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
32910 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
32920 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
32930 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
32940 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
32950 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
32960 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
32970 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
32980 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
32990 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
329a0 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
329b0 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
329c0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
329d0 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
329e0 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
329f0 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
32a00 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
32a10 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63  ization of pTo c
32a20 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c  an actually fail
32a30 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61   under.    ** fa
32a40 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72  irly obscure cir
32a50 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e  cumstances, even
32a60 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20   though it is a 
32a70 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69  copy of initiali
32a80 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  zed .    ** page
32a90 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20   pFrom..    */. 
32aa0 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
32ab0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   0;.    rc = btr
32ac0 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b  eeInitPage(pTo);
32ad0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32af0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
32b00 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
32b10 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
32b20 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
32b30 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
32b40 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
32b50 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
32b60 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
32b70 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
32b80 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
32b90 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
32ba0 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
32bb0 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
32bc0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
32bd0 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
32be0 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
32bf0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
32c00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
32c10 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
32c20 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
32c30 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
32c40 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
32c50 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
32c60 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
32c70 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
32c80 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
32c90 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
32ca0 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
32cb0 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
32cc0 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
32cd0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
32ce0 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
32cf0 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
32d00 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
32d10 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
32d20 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
32d30 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
32d40 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
32d50 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
32d60 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
32d70 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
32d80 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
32d90 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
32da0 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
32db0 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
32dc0 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
32dd0 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
32de0 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
32df0 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
32e00 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
32e10 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
32e20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
32e30 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
32e40 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
32e50 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
32e60 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
32e70 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
32e80 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
32e90 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
32ea0 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
32eb0 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
32ec0 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
32ed0 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
32ee0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
32ef0 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
32f00 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
32f10 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
32f20 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
32f30 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
32f40 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
32f50 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
32f60 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
32f70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
32f80 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
32f90 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
32fa0 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
32fb0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
32fc0 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
32fd0 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
32fe0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
32ff0 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
33000 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
33010 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
33020 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
33030 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
33040 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
33050 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
33060 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
33070 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
33080 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
33090 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
330a0 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
330b0 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
330c0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
330d0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
330e0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
330f0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
33100 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
33110 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
33120 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
33130 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
33140 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
33150 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
33160 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
33170 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
33180 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
33190 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
331a0 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
331b0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
331c0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
331d0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
331e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
331f0 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
33200 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
33210 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
33220 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
33230 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
33240 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
33250 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
33260 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
33270 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
33280 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
33290 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
332a0 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
332b0 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
332c0 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
332d0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
332e0 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
332f0 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
33300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
33310 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
33320 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
33330 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
33340 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
33350 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
33360 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
33370 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
33380 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
33390 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
333a0 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
333b0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
333c0 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
333d0 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
333e0 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
333f0 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
33400 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
33410 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
33420 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
33430 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
33440 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
33450 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
33460 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64  _NOMEM..*/.#if d
33470 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
33480 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20   && _MSC_VER >= 
33490 31 37 30 30 20 26 26 20 64 65 66 69 6e 65 64 28  1700 && defined(
334a0 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d 61 20  _M_ARM).#pragma 
334b0 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f 66 66  optimize("", off
334c0 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
334d0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
334e0 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oot(.  MemPage *
334f0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  pParent,        
33500 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
33510 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67   page of sibling
33520 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
33530 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
33540 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  tIdx,           
33550 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
33560 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20  f "the page" in 
33570 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20  pParent */.  u8 
33580 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20  *aOvflSpace,    
33590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
335a0 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
335b0 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72  of space for par
335c0 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e  ent ovfl */.  in
335d0 74 20 69 73 52 6f 6f 74 2c 20 20 20 20 20 20 20  t isRoot,       
335e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
335f0 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
33600 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   is a root-page 
33610 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b 20 20  */.  int bBulk  
33620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33630 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
33640 74 68 69 73 20 63 61 6c 6c 20 69 73 20 70 61 72  this call is par
33650 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f 61 64  t of a bulk load
33660 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
33670 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
33680 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
33690 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
336a0 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
336b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
336c0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
336d0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
336e0 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
336f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
33700 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
33710 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
33720 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
33730 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
33740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33750 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
33760 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
33770 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
33780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33790 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
337a0 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
337b0 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
337c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
337d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
337e0 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
337f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33800 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
33810 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
33820 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
33830 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33840 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
33850 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
33860 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65  .  u16 leafCorre
33870 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
33880 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
33890 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
338a0 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
338b0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
338c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
338d0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
338e0 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
338f0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
33900 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
33910 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
33920 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
33930 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
33940 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
33950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
33960 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
33970 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
33980 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
33990 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
339a0 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
339b0 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
339c0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
339d0 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
339e0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
339f0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
33a00 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
33a10 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20  iOvflSpace = 0; 
33a20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
33a30 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
33a40 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f   aOvflSpace[] */
33a50 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
33a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33a70 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
33a80 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
33a90 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
33aa0 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
33ab0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
33ac0 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
33ad0 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  lings */.  MemPa
33ae0 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
33af0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
33b00 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
33b10 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
33b20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
33b30 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
33b40 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
33b50 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
33b60 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
33b70 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20   u8 *pRight;    
33b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33b90 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72   Location in par
33ba0 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62  ent of right-sib
33bb0 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ling pointer */.
33bc0 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31    u8 *apDiv[NB-1
33bd0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
33be0 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
33bf0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
33c00 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
33c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
33c20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
33c30 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
33c40 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
33c50 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
33c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
33c70 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
33c80 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
33c90 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
33ca0 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
33cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
33cc0 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
33cd0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
33ce0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
33cf0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
33d00 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
33d10 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
33d20 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
33d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d40 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
33d50 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
33d60 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f   cells */.  Pgno
33d70 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
33d80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
33d90 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20   var to store a 
33da0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a  page number in *
33db0 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65  /..  pBt = pPare
33dc0 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  nt->pBt;.  asser
33dd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
33de0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
33df0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
33e00 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33e10 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
33e20 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66  pDbPage) );..#if
33e30 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   0.  TRACE(("BAL
33e40 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
33e50 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
33e60 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
33e70 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
33e80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
33e90 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61  t this point pPa
33ea0 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74  rent may have at
33eb0 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c   most one overfl
33ec0 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a  ow cell. And if.
33ed0 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c    ** this overfl
33ee0 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65  ow cell is prese
33ef0 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  nt, it must be t
33f00 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20  he cell with .  
33f10 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74  ** index iParent
33f20 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72  Idx. This scenar
33f30 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  io comes about w
33f40 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
33f50 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  n.  ** is called
33f60 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72   (indirectly) fr
33f70 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  om sqlite3BtreeD
33f80 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  elete()..  */.  
33f90 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
33fa0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
33fb0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
33fc0 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  low==1 );.  asse
33fd0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
33fe0 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
33ff0 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d  rent->aiOvfl[0]=
34000 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a  =iParentIdx );..
34010 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63    if( !aOvflSpac
34020 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
34030 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
34040 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
34050 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
34060 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20  o balance. Also 
34070 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73  locate the cells
34080 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a   in pParent .  *
34090 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68  * that divide th
340a0 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61  e siblings. An a
340b0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
340c0 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
340d0 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68  gs on .  ** eith
340e0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
340f0 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  . More siblings 
34100 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
34110 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
34120 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  , .  ** if there
34130 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
34140 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
34150 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49  he other side. I
34160 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68  f pParent.  ** h
34170 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63  as NB or fewer c
34180 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c  hildren then all
34190 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
341a0 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20  rent are taken. 
341b0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
341c0 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73   loop also drops
341d0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
341e0 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ls from the pare
341f0 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20  nt page. This.  
34200 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61  ** way, the rema
34210 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e  inder of the fun
34220 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68  ction does not h
34230 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ave to deal with
34240 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c   any.  ** overfl
34250 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ow cells in the 
34260 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e  parent page, sin
34270 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65  ce if any existe
34280 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a  d they will.  **
34290 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
342a0 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f  en removed..  */
342b0 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e  .  i = pParent->
342c0 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72  nOverflow + pPar
342d0 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  ent->nCell;.  if
342e0 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44  ( i<2 ){.    nxD
342f0 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  iv = 0;.  }else{
34300 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75  .    assert( bBu
34310 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d  lk==0 || bBulk==
34320 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  1 );.    if( iPa
34330 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
34340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
34350 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
34360 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
34370 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
34380 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
34390 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73  +bBulk;.    }els
343a0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
343b0 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20   bBulk==0 );.   
343c0 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
343d0 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
343e0 20 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a     i = 2-bBulk;.
343f0 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b 31    }.  nOld = i+1
34400 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76  ;.  if( (i+nxDiv
34410 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
34420 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  low)==pParent->n
34430 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67  Cell ){.    pRig
34440 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61  ht = &pParent->a
34450 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
34460 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65  rOffset+8];.  }e
34470 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20  lse{.    pRight 
34480 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
34490 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
344a0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
344b0 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65  .  }.  pgno = ge
344c0 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a  t4byte(pRight);.
344d0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
344e0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
344f0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
34500 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a   &apOld[i], 0);.
34510 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
34520 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
34530 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
34540 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
34550 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
34560 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
34570 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
34580 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
34590 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
345a0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
345b0 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b  (i--)==0 ) break
345c0 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44  ;..    if( i+nxD
345d0 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f  iv==pParent->aiO
345e0 76 66 6c 5b 30 5d 20 26 26 20 70 50 61 72 65 6e  vfl[0] && pParen
345f0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  t->nOverflow ){.
34600 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
34610 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c   pParent->apOvfl
34620 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  [0];.      pgno 
34630 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
34640 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
34650 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
34660 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
34670 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61  v[i]);.      pPa
34680 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
34690 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
346a0 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
346b0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
346c0 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
346d0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
346e0 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
346f0 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
34700 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
34710 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
34720 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
34730 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70  ;..      /* Drop
34740 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   the cell from t
34750 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
34760 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70  apDiv[i] still p
34770 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  oints to.      *
34780 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  * the cell withi
34790 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76  n the parent, ev
347a0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73  en though it has
347b0 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20   been dropped.. 
347c0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
347d0 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f  safe because dro
347e0 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c  pping a cell onl
347f0 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  y overwrites the
34800 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
34810 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74  four bytes of it
34820 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
34830 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
34840 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  d the first.    
34850 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
34860 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
34870 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e  ell. So the poin
34880 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75  ter is safe to u
34890 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65  se.      ** late
348a0 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a  r on.  .      **
348b0 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
348c0 74 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 73  t if we are in s
348d0 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
348e0 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65 6c  e. In secure-del
348f0 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20  ete mode,.      
34900 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
34910 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
34920 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
34930 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
34940 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
34950 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
34960 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
34970 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
34980 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
34990 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
349a0 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
349b0 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
349c0 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
349d0 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
349e0 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
349f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
34a00 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
34a10 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
34a20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
34a30 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f  Off;..        iO
34a40 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ff = SQLITE_PTR_
34a50 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29  TO_INT(apDiv[i])
34a60 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   - SQLITE_PTR_TO
34a70 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44  _INT(pParent->aD
34a80 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
34a90 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d  ( (iOff+szNew[i]
34aa0 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  )>(int)pBt->usab
34ab0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
34ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34ad0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34ae0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
34af0 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73  pOld, 0, (i+1)*s
34b00 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29  izeof(MemPage*))
34b10 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
34b20 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
34b30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
34b40 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
34b50 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  y(&aOvflSpace[iO
34b60 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  ff], apDiv[i], s
34b70 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zNew[i]);.      
34b80 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
34b90 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
34ba0 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
34bb0 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta];.        }. 
34bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f       }.      dro
34bd0 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  pCell(pParent, i
34be0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
34bf0 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77  nOverflow, szNew
34c00 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  [i], &rc);.    }
34c10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
34c20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
34c30 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
34c40 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
34c50 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
34c60 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
34c70 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
34c80 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
34c90 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
34ca0 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
34cb0 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
34cc0 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69   k = pBt->pageSi
34cd0 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ze + ROUND8(size
34ce0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
34cf0 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
34d00 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
34d10 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
34d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34d30 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
34d40 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
34d50 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
34d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34d70 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
34d80 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
34d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34db0 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
34dc0 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20    + k*nOld;     
34dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34df0 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28  /* Page copies (
34e00 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43  apCopy) */.  apC
34e10 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
34e20 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
34e30 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
34e40 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
34e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
34e60 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
34e70 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
34e80 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
34e90 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
34ea0 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31  ells];.  aSpace1
34eb0 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
34ec0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
34ed0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
34ee0 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63  _ALIGNMENT(aSpac
34ef0 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  e1) );..  /*.  *
34f00 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
34f10 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
34f20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
34f30 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
34f40 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
34f50 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
34f60 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
34f70 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
34f80 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
34f90 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
34fa0 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b  ed from aSpace1[
34fb0 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
34fc0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
34fd0 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
34fe0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
34ff0 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
35000 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
35010 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
35020 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
35030 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
35040 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
35050 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
35060 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
35070 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
35080 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
35090 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
350a0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
350b0 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
350c0 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
350d0 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
350e0 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
350f0 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
35100 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
35110 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
35120 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
35130 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
35140 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
35150 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
35160 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
35170 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
35180 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
35190 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
351a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
351b0 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
351c0 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
351d0 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
351e0 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
351f0 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  */.  leafCorrect
35200 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ion = apOld[0]->
35210 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
35220 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68  ta = apOld[0]->h
35230 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
35240 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
35250 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a  .    int limit;.
35260 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f      .    /* Befo
35270 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
35280 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63  g else, take a c
35290 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20  opy of the i'th 
352a0 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67  original sibling
352b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74  .    ** The rest
352c0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
352d0 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
352e0 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
352f0 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68  rather.    ** th
35300 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
35310 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
35320 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
35330 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
35340 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
35350 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
35360 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  n.  */.    MemPa
35370 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
35380 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
35390 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70  )&aSpace1[pBt->p
353a0 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a  ageSize + k*i];.
353b0 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c      memcpy(pOld,
353c0 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
353d0 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
353e0 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28   pOld->aData = (
353f0 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a  void*)&pOld[1];.
35400 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d      memcpy(pOld-
35410 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
35420 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
35430 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69  geSize);..    li
35440 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
35450 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
35460 77 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 2d  w;.    if( pOld-
35470 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a  >nOverflow>0 ){.
35480 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
35490 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
354a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
354b0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
354c0 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
354d0 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
354e0 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
354f0 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
35500 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
35510 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
35520 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
35530 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
35540 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35550 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61 74  {.      u8 *aDat
35560 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b  a = pOld->aData;
35570 0a 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 50  .      u16 maskP
35580 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b  age = pOld->mask
35590 50 61 67 65 3b 0a 20 20 20 20 20 20 75 31 36 20  Page;.      u16 
355a0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c  cellOffset = pOl
355b0 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  d->cellOffset;. 
355c0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
355d0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
355e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
355f0 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
35600 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
35610 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  Cell] = findCell
35620 76 32 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61  v2(aData, maskPa
35630 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20  ge, cellOffset, 
35640 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
35650 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
35660 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
35670 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
35680 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
35690 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 20       }.    }    
356a0 20 20 20 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f     .    if( i<nO
356b0 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74  ld-1 && !leafDat
356c0 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a  a){.      u16 sz
356d0 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d   = (u16)szNew[i]
356e0 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
356f0 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
35700 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
35710 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
35720 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
35730 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
35740 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20  ace1[iSpace1];. 
35750 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
35760 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
35770 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f  ( sz<=pBt->maxLo
35780 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20  cal+23 );.      
35790 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31 20  assert( iSpace1 
357a0 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67  <= (int)pBt->pag
357b0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d  eSize );.      m
357c0 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
357d0 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
357e0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
357f0 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
35800 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73  ection;.      as
35810 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
35820 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
35830 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
35840 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
35850 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65  ll] = szCell[nCe
35860 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63  ll] - leafCorrec
35870 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
35880 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
35890 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
358a0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
358b0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
358c0 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  rt( pOld->hdrOff
358d0 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
358e0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
358f0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
35900 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
35910 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
35920 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
35930 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
35940 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
35950 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
35960 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
35970 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[8], 4);.    
35980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35990 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
359a0 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
359b0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
359c0 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
359d0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
359e0 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
359f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
35a00 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
35a10 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
35a20 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 4;.        }
35a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
35a40 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
35a50 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
35a60 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
35a70 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
35a80 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
35a90 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
35aa0 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
35ab0 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
35ac0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
35ad0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
35ae0 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
35af0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
35b00 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
35b10 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
35b20 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
35b30 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
35b40 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
35b50 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
35b60 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
35b70 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
35b80 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
35b90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
35ba0 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
35bb0 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
35bc0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
35bd0 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
35be0 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
35bf0 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
35c00 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
35c10 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
35c20 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
35c30 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
35c40 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
35c50 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
35c60 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
35c70 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
35c80 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
35c90 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
35ca0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
35cb0 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
35cc0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
35cd0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
35ce0 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
35cf0 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
35d00 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
35d10 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
35d20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
35d30 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
35d40 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
35d50 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
35d60 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
35d70 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
35d80 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
35d90 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
35da0 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
35db0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
35dc0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
35dd0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
35de0 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
35df0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
35e00 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
35e10 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
35e20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69      k++;.      i
35e30 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20  f( k>NB+1 ){ rc 
35e40 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
35e50 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  _BKPT; goto bala
35e60 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
35e70 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
35e80 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
35e90 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
35ea0 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
35eb0 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
35ec0 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
35ed0 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
35ee0 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
35ef0 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
35f00 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
35f10 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
35f20 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
35f30 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
35f40 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
35f50 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
35f60 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
35f70 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
35f80 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
35f90 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
35fa0 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
35fb0 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
35fc0 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
35fd0 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
35fe0 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
35ff0 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
36000 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
36010 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
36020 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
36030 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
36040 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
36050 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
36060 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
36070 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
36080 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
36090 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
360a0 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
360b0 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
360c0 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
360d0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
360e0 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
360f0 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
36100 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
36110 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
36120 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
36130 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
36140 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
36150 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
36160 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
36170 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
36180 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
36190 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
361a0 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
361b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
361c0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
361d0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
361e0 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
361f0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
36200 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
36210 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
36220 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
36230 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
36240 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
36250 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
36260 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 0a 20  e( szRight==0 . 
36270 20 20 20 20 20 20 7c 7c 20 28 21 62 42 75 6c 6b        || (!bBulk
36280 20 26 26 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   && szRight+szCe
36290 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
362a0 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a  (szCell[r]+2)) .
362b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 7a 52      ){.      szR
362c0 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64  ight += szCell[d
362d0 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c  ] + 2;.      szL
362e0 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d  eft -= szCell[r]
362f0 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e   + 2;.      cntN
36300 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20  ew[i-1]--;.     
36310 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
36320 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20   - 1;.      d = 
36330 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
36340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65  ;.    }.    szNe
36350 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a  w[i] = szRight;.
36360 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d      szNew[i-1] =
36370 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20   szLeft;.  }..  
36380 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75  /* Either we fou
36390 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  nd one or more c
363a0 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29  ells (cntnew[0])
363b0 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a  >0) or pPage is.
363c0 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
363d0 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
363e0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
363f0 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
36400 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
36410 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
36420 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
36430 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
36440 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 50 44 41 54  .  **.  ** UPDAT
36450 45 3a 20 20 54 68 65 20 61 73 73 65 72 74 28 29  E:  The assert()
36460 20 62 65 6c 6f 77 20 69 73 20 6e 6f 74 20 6e 65   below is not ne
36470 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 69  cessarily true i
36480 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
36490 20 2a 2a 20 66 69 6c 65 20 69 73 20 63 6f 72 72   ** file is corr
364a0 75 70 74 2e 20 20 54 68 65 20 63 6f 72 72 75 70  upt.  The corrup
364b0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 65 74  tion will be det
364c0 65 63 74 65 64 20 61 6e 64 20 72 65 70 6f 72 74  ected and report
364d0 65 64 20 6c 61 74 65 72 0a 20 20 2a 2a 20 69 6e  ed later.  ** in
364e0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
364f0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  so there is no n
36500 65 65 64 20 74 6f 20 61 63 74 20 75 70 6f 6e 20  eed to act upon 
36510 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66  it now..  */.#if
36520 20 30 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   0.  assert( cnt
36530 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
36540 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
36550 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
36560 3d 30 29 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  =0) );.#endif.. 
36570 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
36580 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
36590 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d   ",.    apOld[0]
365a0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c  ->pgno, .    nOl
365b0 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d  d>=2 ? apOld[1]-
365c0 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e  >pgno : 0,.    n
365d0 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32  Old>=3 ? apOld[2
365e0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29  ]->pgno : 0.  ))
365f0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
36600 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
36610 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
36620 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
36630 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61  le..  */.  if( a
36640 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31  pOld[0]->pgno<=1
36650 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
36660 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
36670 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
36680 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
36690 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70    pageFlags = ap
366a0 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d  Old[0]->aData[0]
366b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
366c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
366d0 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
366e0 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
366f0 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
36700 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
36710 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
36720 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
36730 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36740 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
36750 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
36760 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
36770 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
36780 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
36790 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
367a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
367b0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
367c0 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
367d0 6f 2c 20 28 62 42 75 6c 6b 20 3f 20 31 20 3a 20  o, (bBulk ? 1 : 
367e0 70 67 6e 6f 29 2c 20 30 29 3b 0a 20 20 20 20 20  pgno), 0);.     
367f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
36800 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
36810 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
36820 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
36830 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  w++;..      /* S
36840 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
36850 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ap entry for the
36860 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
36870 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
36880 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
36890 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
368a0 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
368b0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
368c0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
368d0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
368e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
368f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
36900 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
36910 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
36920 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
36930 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
36940 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
36950 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
36960 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
36970 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
36980 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  ){.    freePage(
36990 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a  apOld[i], &rc);.
369a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
369b0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
369c0 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
369d0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
369e0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
369f0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
36a00 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
36a10 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
36a20 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
36a30 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
36a40 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
36a50 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
36a60 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
36a70 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
36a80 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
36a90 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
36aa0 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
36ab0 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
36ac0 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
36ad0 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
36ae0 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
36af0 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
36b00 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
36b10 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
36b20 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
36b30 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
36b40 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
36b50 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
36b60 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
36b70 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
36b80 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
36b90 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
36ba0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
36bb0 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
36bc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
36bd0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
36be0 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
36bf0 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
36c00 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
36c10 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
36c20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
36c30 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
36c40 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e  inV = apNew[i]->
36c50 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69  pgno;.    int mi
36c60 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
36c70 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
36c80 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  {.      if( apNe
36c90 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69  w[j]->pgno<(unsi
36ca0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
36cb0 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
36cc0 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70         minV = ap
36cd0 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[j]->pgno;.  
36ce0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
36cf0 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
36d00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
36d10 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
36d20 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  w[i];.      apNe
36d30 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
36d40 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
36d50 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
36d60 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
36d70 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
36d80 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
36d90 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
36da0 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apNew[0]->pgno, 
36db0 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
36dc0 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d  ew>=2 ? apNew[1]
36dd0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
36de0 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
36df0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
36e00 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f  ? apNew[2]->pgno
36e10 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
36e20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
36e30 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65    nNew>=4 ? apNe
36e40 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[3]->pgno : 0, 
36e50 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
36e60 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
36e70 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e  >=5 ? apNew[4]->
36e80 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
36e90 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
36ea0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ));..  assert( s
36eb0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36ec0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
36ed0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75  pDbPage) );.  pu
36ee0 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61  t4byte(pRight, a
36ef0 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67  pNew[nNew-1]->pg
36f00 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  no);..  /*.  ** 
36f10 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
36f20 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
36f30 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
36f40 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
36f50 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
36f60 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
36f70 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
36f80 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
36f90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
36fa0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
36fb0 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
36fc0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
36fd0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
36fe0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
36ff0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
37000 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a  axCells );.    z
37010 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
37020 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
37030 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
37040 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
37050 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
37060 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
37070 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
37080 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
37090 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
370a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
370b0 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
370c0 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  );..    j = cntN
370d0 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
370e0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
370f0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
37100 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
37110 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
37120 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
37130 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
37140 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
37150 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
37160 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d   assert( i<nNew-
37170 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  1 || j==nCell );
37180 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c  .    if( j<nCell
37190 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
371a0 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
371b0 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
371c0 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
371d0 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
371e0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
371f0 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
37200 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
37210 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
37220 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
37230 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66  &aOvflSpace[iOvf
37240 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69  lSpace];.      i
37250 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
37260 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
37270 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
37280 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
37290 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
372a0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
372b0 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
372c0 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
372d0 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
372e0 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
372f0 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
37300 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
37310 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
37320 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
37330 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
37340 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
37350 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
37360 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
37370 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
37380 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
37390 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
373a0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
373b0 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
373c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
373d0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
373e0 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
373f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
37400 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
37410 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
37420 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
37430 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34  ;.        sz = 4
37440 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43   + putVarint(&pC
37450 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65  ell[4], info.nKe
37460 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  y);.        pTem
37470 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
37480 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
37490 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
374a0 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
374b0 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
374c0 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
374d0 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
374e0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
374f0 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
37500 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
37510 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
37520 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
37530 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
37540 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
37550 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
37560 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
37570 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72  ** (see btreePar
37580 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
37590 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
375a0 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
375b0 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
375c0 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
375d0 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
375e0 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
375f0 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
37600 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
37610 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
37620 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
37630 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
37640 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
37650 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
37660 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
37670 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
37680 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
37690 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
376a0 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
376b0 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
376c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
376d0 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
376e0 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
376f0 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
37700 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
37710 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
37720 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
37730 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
37740 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
37750 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
37760 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
37770 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
37780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37790 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b  OvflSpace += sz;
377a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
377b0 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
377c0 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
377d0 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 20  ert( iOvflSpace 
377e0 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67  <= (int)pBt->pag
377f0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
37800 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
37810 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
37820 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77   sz, pTemp, pNew
37830 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
37840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37850 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
37860 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
37870 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
37880 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37890 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
378a0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
378b0 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
378c0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
378d0 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
378e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
378f0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
37900 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
37910 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
37920 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
37930 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
37940 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
37950 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
37960 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
37970 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
37980 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a  zChild, 4);.  }.
37990 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26  .  if( isRoot &&
379a0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
379b0 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68  =0 && pParent->h
379c0 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b  drOffset<=apNew[
379d0 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  0]->nFree ){.   
379e0 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
379f0 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
37a00 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  now contains no 
37a10 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20  cells. The only 
37a20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70  sibling.    ** p
37a30 61 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74  age is the right
37a40 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
37a50 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63  rent. Copy the c
37a60 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
37a70 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65     ** child page
37a80 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
37a90 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65  , decreasing the
37aa0 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20   overall height 
37ab0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d  of the.    ** b-
37ac0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62  tree structure b
37ad0 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64  y one. This is d
37ae0 65 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20  escribed as the 
37af0 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77  "balance-shallow
37b00 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61  er".    ** sub-a
37b10 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65  lgorithm in some
37b20 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
37b30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
37b40 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
37b50 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
37b60 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  , the call to co
37b70 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20  pyNodeContent() 
37b80 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c  .    ** sets all
37b90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37ba0 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
37bb0 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69  ng to database i
37bc0 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  mage pages .    
37bd0 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ** for which the
37be0 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72   pointer is stor
37bf0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f  ed within the co
37c00 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69  ntent being copi
37c10 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
37c20 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73  * The second ass
37c30 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69  ert below verifi
37c40 65 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c  es that the chil
37c50 64 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67  d page is defrag
37c60 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69  mented.    ** (i
37c70 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74  t must be, as it
37c80 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73   was just recons
37c90 74 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73  tructed using as
37ca0 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54  semblePage()). T
37cb0 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d  his.    ** is im
37cc0 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70  portant if the p
37cd0 61 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65  arent page happe
37ce0 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20  ns to be page 1 
37cf0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
37d00 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a      ** image.  *
37d10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e  /.    assert( nN
37d20 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ew==1 );.    ass
37d30 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e  ert( apNew[0]->n
37d40 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20  Free == .       
37d50 20 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65   (get2byte(&apNe
37d60 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d  w[0]->aData[5])-
37d70 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66  apNew[0]->cellOf
37d80 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  fset-apNew[0]->n
37d90 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a  Cell*2) .    );.
37da0 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74      copyNodeCont
37db0 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50  ent(apNew[0], pP
37dc0 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20  arent, &rc);.   
37dd0 20 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b   freePage(apNew[
37de0 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73  0], &rc);.  }els
37df0 65 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55  e if( ISAUTOVACU
37e00 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78  UM ){.    /* Fix
37e10 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
37e20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
37e30 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20   the cells that 
37e40 77 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f  were shifted aro
37e50 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65  und. .    ** The
37e60 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64  re are several d
37e70 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
37e80 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  f pointer-map en
37e90 74 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20  tries that need 
37ea0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  to.    ** be dea
37eb0 6c 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20  lt with by this 
37ec0 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66  routine. Some of
37ed0 20 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e   these have been
37ee0 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75   set already, bu
37ef0 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61  t.    ** many ha
37f00 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c  ve not. The foll
37f10 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61  owing is a summa
37f20 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry:.    **.    *
37f30 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69  *   1) The entri
37f40 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
37f50 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  th new sibling p
37f60 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
37f70 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73  ot.    **      s
37f80 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69  iblings when thi
37f90 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
37fa0 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76  alled. These hav
37fb0 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  e already.    **
37fc0 20 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20        been set. 
37fd0 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  We don't need to
37fe0 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64   worry about old
37ff0 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
38000 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ere.    **      
38010 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
38020 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65  e-list - the fre
38030 65 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73  ePage() code has
38040 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20   taken care.    
38050 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  **      of those
38060 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
38070 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72    2) The pointer
38080 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73  -map entries ass
38090 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
380a0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a   first overflow.
380b0 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65      **      page
380c0 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77   in any overflow
380d0 20 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20   chains used by 
380e0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
380f0 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a  s. These .    **
38100 20 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20        have also 
38110 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b  already been tak
38120 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68  en care of by th
38130 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63  e insertCell() c
38140 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
38150 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73  **   3) If the s
38160 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
38170 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
38180 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
38190 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20  s of.    **     
381a0 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e   cells stored on
381b0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
381c0 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  es may need to b
381d0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
381e0 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66  *.    **   4) If
381f0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
38200 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  es are not inter
38210 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
38220 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a  , then any.    *
38230 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20  *      overflow 
38240 70 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68  pages used by th
38250 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65  ese cells may ne
38260 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
38270 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e  .    **      (in
38280 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f  ternal intkey no
38290 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  des never contai
382a0 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76  n pointers to ov
382b0 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20  erflow pages).. 
382c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35     **.    **   5
382d0 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
382e0 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
382f0 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
38300 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
38310 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20  **      entries 
38320 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68  for the right-ch
38330 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63  ild pages of eac
38340 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65  h sibling may ne
38350 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  ed.    **      t
38360 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
38370 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65    **.    ** Case
38380 73 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65  s 1 and 2 are de
38390 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62  alt with above b
383a0 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68  y other code. Th
383b0 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
383c0 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63  ock deals with c
383d0 61 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64  ases 3 and 4 and
383e0 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74   the one after t
383f0 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e  hat, case 5. Sin
38400 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  ce.    ** settin
38410 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  g a pointer map 
38420 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74  entry is a relat
38430 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20  ively expensive 
38440 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a  operation, this.
38450 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79      ** code only
38460 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61   sets pointer ma
38470 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68  p entries for ch
38480 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
38490 70 61