/ Hex Artifact Content
Login

Artifact 5f2c4fe72f663bba837c5d01a732799c1d1c93f8:


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 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4d10: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4d20: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4d30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4d40: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4d50: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4d60: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4d80: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4d90: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4da0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4db0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4dc0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4dd0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4de0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4df0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  .../*.** Save th
4e00: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
4e10: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
4e20: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
4e30: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
4e40: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
4e50: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
4e60: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
4e70: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
4e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4e90: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
4ea0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
4eb0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
4ec0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
4ed0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
4ee0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
4ef0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
4f00: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
4f10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
4f20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
4f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
4f40: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
4f50: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
4f60: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
4f70: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
4f80: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
4f90: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20  (pCur) );..  rc 
4fa0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
4fb0: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75  ySize(pCur, &pCu
4fc0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65  r->nKey);.  asse
4fd0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4fe0: 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65  K );  /* KeySize
4ff0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  () cannot fail *
5000: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
5010: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
5020: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
5030: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
5040: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
5050: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
5060: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
5070: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
5080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
5090: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
50a0: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
50b0: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
50c0: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
50d0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
50e0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
50f0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
5100: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
5110: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
5120: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
5130: 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61    if( 0==pCur->a
5140: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5150: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   ){.    void *pK
5160: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
5170: 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e  oc( (int)pCur->n
5180: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5190: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
51a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
51b0: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
51c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
51d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
51e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5200: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
5210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5220: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
5230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5240: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5260: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5270: 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ( !pCur->apPage[
5280: 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70  0]->intKey || !p
5290: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20  Cur->pKey );..  
52a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
52b0: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
52c0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
52d0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
52f0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5300: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
5310: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
5320: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
5330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
5340: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5350: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5360: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5370: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5380: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 20  n.** the table  
5390: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
53a0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
53b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
53c0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
53d0: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
53e0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
53f0: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
5400: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5410: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
5420: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5430: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5440: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5450: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5460: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
5470: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
5480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
54a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
54b0: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
54c0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
54d0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
54e0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
54f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
5500: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
5510: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
5520: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
5530: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
5540: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5550: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5560: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5570: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5580: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5590: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
55a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
55c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
55d0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
55e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
55f0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5600: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
5640: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5650: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
5660: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
5670: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
56a0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
56b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
56c0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
56d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
56e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56f0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
5710: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
5720: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
5730: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
5740: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
5750: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
5760: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
5770: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
5780: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
5790: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
57a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
57b0: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
57c0: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
57d0: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
57e0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
57f0: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
5800: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
5810: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
5820: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
5830: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
5840: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
5850: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
5860: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
5880: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
5890: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
58a0: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
58b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
58c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
58d0: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
58e0: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
58f0: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
5900: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
5910: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
5920: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
5950: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
5960: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
5970: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
5980: 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
5990: 20 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20   aSpace[150];   
59a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
59b0: 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
59c0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
59d0: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
59e0: 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66  pFree = 0;..  if
59f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
5a00: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
5a10: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
5a20: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
5a30: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
5a40: 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
5a50: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e      pCur->pKeyIn
5a60: 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65  fo, aSpace, size
5a70: 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72  of(aSpace), &pFr
5a80: 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ee.    );.    if
5a90: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
5aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ab0: 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  EM;.    sqlite3V
5ac0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
5af0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c   pIdxKey);.  }el
5b00: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
5b10: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
5b20: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
5b30: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
5b40: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
5b50: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
5b60: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
5b70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
5b80: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
5b90: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
5ba0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5bb0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
5bc0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
5bd0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
5be0: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
5bf0: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
5c00: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
5c10: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
5c20: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
5c30: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
5c40: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
5c50: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
5c60: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
5c70: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
5c80: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
5c90: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
5ca0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
5cb0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5cc0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
5cd0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
5cf0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
5d00: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5d10: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5d20: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5d30: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
5d40: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
5d60: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
5d70: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
5d80: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5d90: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
5da0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5db0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
5dc0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
5dd0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
5de0: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
5df0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
5e00: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
5e10: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
5e20: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
5e30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5e50: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5e60: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5e70: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5e80: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5e90: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ea0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5eb0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d  R_INVALID );.  }
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65  .#define restore
5ee0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5ef0: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
5f00: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
5f10: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
5f20: 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75    btreeRestoreCu
5f30: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5f40: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
5f50: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
5f60: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
5f70: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
5f80: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
5f90: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a  the position it.
5fa0: 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  ** was last plac
5fb0: 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20  ed at.  Cursors 
5fc0: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
5fd0: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
5fe0: 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73  ointing.** at is
5ff0: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
6000: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a  m under them..**
6010: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6020: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
6030: 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68  r code if someth
6040: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20  ing goes wrong. 
6050: 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   The.** integer 
6060: 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65  *pHasMoved is se
6070: 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20  t to one if the 
6080: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
6090: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
60a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
60b0: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
60c0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
60d0: 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29   int *pHasMoved)
60e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  {.  int rc;..  r
60f0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6100: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6110: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6120: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
6130: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
6140: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
6150: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
6160: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b  ALID || pCur->sk
6170: 69 70 4e 65 78 74 21 3d 30 20 29 7b 0a 20 20 20  ipNext!=0 ){.   
6180: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
6190: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
61a0: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
61b0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
61c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
61d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
61e0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
61f0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
6200: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
6210: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
6220: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
6230: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6240: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
6250: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6260: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
6270: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
6280: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
6290: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
62a0: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
62b0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
62c0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
62d0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
62e0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
62f0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
6300: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
6310: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
6320: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
6330: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
6340: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
6350: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
6360: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
6370: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6380: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
6390: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
63a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63c0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
63d0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
63e0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
63f0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
6400: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
6410: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
6420: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
6430: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
6440: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
6450: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
6480: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
6490: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
64a0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
64b0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
64c0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
64d0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
64e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
64f0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
6500: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
6510: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
6520: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
6530: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
6540: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
6550: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
6560: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
6570: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
6580: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
6590: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
65a0: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
65b0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
65c0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
65d0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
65e0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
65f0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
6600: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
6610: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
6620: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
6630: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
6640: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
6650: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
6660: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
6670: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
6680: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6690: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
66a0: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
66b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
66c0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
66d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
66e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
66f0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
6700: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
6710: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
6720: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
6730: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
6740: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
6750: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
6760: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6770: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
6780: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
6790: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
67a0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
67b0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
67c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
67d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
67e0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
67f0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
6800: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
6810: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
6820: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
6830: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
6840: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
6850: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6860: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
6870: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
6880: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
6890: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
68a0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
68b0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
68c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
68d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
68e0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
68f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6900: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
6910: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
6920: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
6930: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
6940: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
6950: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6960: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
6970: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
6980: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
6990: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
69a0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
69b0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
69c0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
69d0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
69e0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
69f0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
6a00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6a10: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
6a20: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
6a30: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
6a40: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
6a50: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
6a60: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
6a70: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
6a80: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
6a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6aa0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
6ab0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
6ac0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
6ad0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6ae0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
6af0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
6b00: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
6b10: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6b20: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
6b30: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
6b40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6b60: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
6b70: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6b80: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
6b90: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
6ba0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
6bb0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
6bc0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
6bd0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
6be0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
6bf0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
6c00: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
6c10: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
6c20: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
6c30: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
6c40: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
6c50: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
6c60: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
6c70: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
6c80: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
6c90: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6ca0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
6cb0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6cc0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6cd0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
6ce0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
6cf0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
6d00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
6d10: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
6d20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
6d30: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
6d40: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
6d50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6d60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6d70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
6d80: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6d90: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6da0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6db0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6dc0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
6dd0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
6de0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
6df0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
6e00: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
6e10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
6e20: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
6e30: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
6e40: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
6e50: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
6e60: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73  ffset<0 ){.    s
6e70: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
6e80: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72  (pDbPage);.    r
6e90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6ea0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
6eb0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
6ec0: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
6ed0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61  bleSize-5 );.  a
6ee0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
6ef0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
6f00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
6f10: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
6f20: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
6f30: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6f40: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
6f50: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
6f60: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
6f70: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
6f80: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
6f90: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6fa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6fb0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
6fc0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
6fd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6fe0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
6ff0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
7000: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
7010: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
7020: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
7030: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
7040: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
7050: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
7060: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
7070: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
7080: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
7090: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
70a0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
70b0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
70c0: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
70d0: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
70e0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
70f0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
7100: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
7110: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
7120: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
7130: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7140: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
7150: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
7160: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
7170: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
7180: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
7190: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
71a0: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
71b0: 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29  dCellv2(D,M,O,I)
71c0: 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28   (D+(M&get2byte(
71d0: 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a  D+(O+2*(I)))))..
71e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
71f0: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
7200: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
7210: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
7220: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
7230: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
7240: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  w cells..*/.stat
7250: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
7260: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
7270: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
7280: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
7290: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
72a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
72b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
72c0: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
72d0: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
72e0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
72f0: 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65  k;.    k = pPage
7300: 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  ->aiOvfl[i];.   
7310: 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b   if( k<=iCell ){
7320: 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43  .      if( k==iC
7330: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ell ){.        r
7340: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f  eturn pPage->apO
7350: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  vfl[i];.      }.
7360: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
7370: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7380: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
7390: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
73a0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
73b0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
73c0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
73d0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
73e0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
73f0: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
7400: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
7410: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
7420: 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c   takes a .** cel
7430: 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73  l index as the s
7440: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
7450: 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  nd btreeParseCel
7460: 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73  lPtr() .** takes
7470: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7480: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65  e body of the ce
7490: 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64  ll as its second
74a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
74b0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c   Within this fil
74c0: 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c  e, the parseCell
74d0: 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20  () macro can be 
74e0: 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f  called instead o
74f0: 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  f.** btreeParseC
7500: 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20  ellPtr(). Using 
7510: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20  some compilers, 
7520: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73  this will be fas
7530: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
7540: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7550: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
7560: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
7570: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
7580: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
7590: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
75a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
75b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
75c0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
75d0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
75e0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
75f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
7600: 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20  .){.  u16 n;    
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7620: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
7630: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
7640: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
7650: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7660: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7670: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7680: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7690: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
76a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
76b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
76c0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
76d0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
76e0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
76f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
7700: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
7710: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
7720: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
7730: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
7740: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
7750: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  y ){.    if( pPa
7760: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
7770: 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72       n += getVar
7780: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
7790: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
77a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
77b0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  yload = 0;.    }
77c0: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
77d0: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
77e0: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
77f0: 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  y);.    pInfo->n
7800: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
7810: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
7820: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a  nfo->nData = 0;.
7830: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
7840: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
7850: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
7860: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
7870: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
7880: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
7890: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
78a0: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
78b0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
78c0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
78d0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
78e0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
78f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
7900: 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  );.  if( likely(
7910: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
7920: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
7930: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
7940: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
7950: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
7960: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
7970: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
7980: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
7990: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
79a0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
79b0: 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69   if( (pInfo->nSi
79c0: 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61  ze = (u16)(n+nPa
79d0: 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66  yload))<4 ) pInf
79e0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
79f0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7a00: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
7a10: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7a20: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
7a30: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
7a40: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
7a50: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
7a60: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
7a70: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
7a80: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
7a90: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
7aa0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
7ab0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
7ac0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
7ad0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
7ae0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
7af0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
7b00: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
7b10: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
7b20: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
7b30: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
7b40: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
7b50: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
7b60: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
7b70: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
7b80: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
7b90: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
7ba0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
7bb0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
7bc0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
7bd0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
7be0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
7bf0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
7c00: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
7c10: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
7c20: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
7c30: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7c40: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7c50: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
7c60: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
7c70: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7c80: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7c90: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
7ca0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
7cb0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
7cc0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
7cd0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
7ce0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
7cf0: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
7d00: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
7d10: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
7d20: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
7d30: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
7d40: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
7d50: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
7d60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
7d70: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
7d80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7d90: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
7da0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
7db0: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
7dc0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
7dd0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
7de0: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  6)surplus;.    }
7df0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
7e00: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
7e10: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d  )minLocal;.    }
7e20: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7e30: 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49  rflow = (u16)(pI
7e40: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29  nfo->nLocal + n)
7e50: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
7e60: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
7e70: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
7e80: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
7e90: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
7ea0: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65   pInfo) \.  btre
7eb0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
7ec0: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
7ed0: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
7ee0: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74  ), (pInfo)).stat
7ef0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7f00: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
7f10: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7f20: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7f30: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7f40: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7f60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
7f70: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
7f80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
7f90: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
7fa0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
7fb0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
7fc0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
7fd0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
7fe0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
7ff0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8000: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
8010: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
8020: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
8030: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
8040: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
8050: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
8060: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
8070: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
8080: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
8090: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
80a0: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
80b0: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
80c0: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
80d0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
80e0: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
80f0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8100: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
8110: 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c   *pIter = &pCell
8120: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
8130: 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69  Size];.  u32 nSi
8140: 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ze;..#ifdef SQLI
8150: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
8160: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8170: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8180: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
8190: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
81a0: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
81b0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
81c0: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
81d0: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
81e0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
81f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
8200: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
8210: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
8220: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
8230: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
8240: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
8250: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
8260: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
8270: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
8280: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8290: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
82a0: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
82b0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
82c0: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
82d0: 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20    u8 *pEnd;.    
82e0: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
82f0: 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  ta ){.      pIte
8300: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8310: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
8320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8330: 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20   nSize = 0;.    
8340: 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  }..    /* pIter 
8350: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8360: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8370: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8380: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8390: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
83a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
83b0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
83c0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
83d0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
83e0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
83f0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8400: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8410: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8420: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8430: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8440: 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
8450: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8460: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
8470: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73  ize);.  }..  tes
8480: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8490: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
84a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
84b0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
84c0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
84d0: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
84e0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
84f0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8500: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8510: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8520: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8530: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
8540: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8550: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8560: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8570: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8580: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8590: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
85a0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
85b0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
85c0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
85d0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
85e0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
85f0: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69   += 4;.  }.  nSi
8600: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
8610: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f  r - pCell);..  /
8620: 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  * The minimum si
8630: 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69  ze of any cell i
8640: 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  s 4 bytes. */.  
8650: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20  if( nSize<4 ){. 
8660: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20     nSize = 4;.  
8670: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69  }..  assert( nSi
8680: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
8690: 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ize );.  return 
86a0: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
86b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
86c0: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
86d0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
86e0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
86f0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8700: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
8710: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
8720: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
8730: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
8740: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
8750: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
8760: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
8770: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
8780: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
8790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
87a0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
87b0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
87c0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
87d0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
87e0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
87f0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
8800: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
8810: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
8820: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
8830: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
8840: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8850: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
8860: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8870: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
8880: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
8890: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
88a0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
88b0: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
88c0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
88d0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
88e0: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
88f0: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
8900: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
8910: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
8920: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
8930: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
8940: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
8950: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
8960: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
8970: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
8980: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
8990: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
89a0: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
89b0: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
89c0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
89d0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
89e0: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
89f0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
8a00: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
8a10: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
8a20: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
8a30: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
8a40: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
8a50: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
8a60: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
8a70: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
8a80: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
8a90: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
8aa0: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
8ab0: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
8ac0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
8ad0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8b00: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
8b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b20: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
8b30: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
8b40: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b60: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8b70: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8b80: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8ba0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
8bb0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
8bc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8bd0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
8be0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
8bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
8c00: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
8c10: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8c20: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
8c30: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
8c40: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
8c50: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8c60: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8c70: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8c80: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
8c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8ca0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
8cb0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
8cc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
8cd0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
8ce0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
8cf0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
8d00: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
8d10: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
8d20: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
8d30: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
8d40: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8d50: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
8d60: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
8d70: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
8d80: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
8d90: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
8da0: 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20   */...  assert( 
8db0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
8dc0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8dd0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8de0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
8df0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8e00: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
8e10: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
8e20: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
8e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8e40: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
8e50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8e60: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8e70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8e80: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
8e90: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
8ea0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
8eb0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
8ec0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
8ed0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
8ee0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
8ef0: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
8f00: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
8f10: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
8f20: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
8f30: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
8f40: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
8f50: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
8f60: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8f70: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
8f80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
8f90: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
8fa0: 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64  (&temp[cbrk], &d
8fb0: 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
8fc0: 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20  eSize - cbrk);. 
8fd0: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
8fe0: 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ze;.  iCellFirst
8ff0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
9000: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  2*nCell;.  iCell
9010: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
9020: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
9030: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
9040: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
9050: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
9060: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
9070: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
9080: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
9090: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
90a0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
90b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
90c0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
90d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
90e0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69  =iCellLast );.#i
90f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9100: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
9110: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
9120: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
9130: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
9140: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
9150: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
9160: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51  e().    ** if SQ
9170: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9180: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20  SIZE_CELL_CHECK 
9190: 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20  is defined .    
91a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
91b0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
91c0: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
91d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
9200: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
9210: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
9220: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
9230: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
9240: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
9250: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
9260: 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  size;.#if define
9270: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
9280: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
9290: 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72  ECK).    if( cbr
92a0: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  k<iCellFirst ){.
92b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
92c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
92d0: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
92e0: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
92f0: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
9300: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
9310: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9320: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9330: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9340: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
9350: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
9360: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
9370: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
9380: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
9390: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
93a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
93b0: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
93c0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
93d0: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
93e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
93f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9400: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
9410: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
9420: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
9430: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9440: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
9450: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
9460: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
9470: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
9480: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
9490: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
94a0: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
94b0: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
94c0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
94d0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
94e0: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
94f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
9500: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
9510: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9520: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9540: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9550: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
9560: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
9570: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
9580: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
9590: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
95a0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
95b0: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
95c0: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
95d0: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
95e0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
95f0: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
9600: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
9610: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
9620: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
9630: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
9640: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
9650: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
9660: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
9670: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
9680: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
9690: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
96a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
96b0: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
96c0: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
96d0: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
96e0: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
96f0: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
9700: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9710: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
9720: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
9730: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
9740: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
9750: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
9760: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
9770: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
9780: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
9790: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
97a0: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
97b0: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
97c0: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
97d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
97e0: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
97f0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9800: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
9810: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
9820: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
9830: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
9840: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
9850: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9860: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
9870: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
9880: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
9890: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
98a0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
98b0: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
98e0: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
98f0: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
9900: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
9930: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
9940: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
9950: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
9960: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
9970: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
9980: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
9990: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
99a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
99b0: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
99c0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75   code */.  int u
99d0: 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
99e0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65  able size of the
99f0: 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73   page */.  .  as
9a00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9a10: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9a20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9a30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a40: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
9a50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9a60: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9a70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9a80: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
9a90: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
9aa0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9ab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9ac0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ae0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9af0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9b00: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9b10: 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  bleSize;.  asser
9b20: 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c  t( nByte < usabl
9b30: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46  eSize-8 );..  nF
9b40: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
9b50: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9b60: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
9b70: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
9b80: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
9b90: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
9ba0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
9bb0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20  e->nCell;.  top 
9bc0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
9bd0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
9be0: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
9bf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9c00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74  ORRUPT_BKPT;.  t
9c10: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
9c20: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9c30: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
9c40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9c50: 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20  ==top );..  if( 
9c60: 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20  nFrag>=60 ){.   
9c70: 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61   /* Always defra
9c80: 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61  gment highly fra
9c90: 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f  gmented pages */
9ca0: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
9cb0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
9cc0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9cd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
9ce0: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
9cf0: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
9d00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61  ;.  }else if( ga
9d10: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
9d20: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
9d30: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
9d40: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
9d50: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
9d60: 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  isfy .    ** the
9d70: 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c   request. The al
9d80: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65  location is made
9d90: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
9da0: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20  free slot in .  
9db0: 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68    ** the list th
9dc0: 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  at is large enou
9dd0: 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 65  gh to accomadate
9de0: 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
9df0: 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20  int pc, addr;.  
9e00: 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31    for(addr=hdr+1
9e10: 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65  ; (pc = get2byte
9e20: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30  (&data[addr]))>0
9e30: 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20  ; addr=pc){.    
9e40: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
9e50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9e60: 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20  f the free slot 
9e70: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e  */.      if( pc>
9e80: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20  usableSize-4 || 
9e90: 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20  pc<addr+4 ){.   
9ea0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9eb0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9ec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9ed0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
9ee0: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
9ef0: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
9f00: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
9f10: 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79  t x = size - nBy
9f20: 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  te;.        test
9f30: 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20  case( x==4 );.  
9f40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9f50: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20  x==3 );.        
9f60: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
9f70: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
9f80: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
9f90: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
9fa0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
9fb0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  .          ** fr
9fc0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
9fd0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
9fe0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
9ff0: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
a000: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
a010: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
a020: 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72  dr+7] = (u8)(nFr
a030: 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20  ag + x);.       
a040: 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b   }else if( size+
a050: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
a060: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
a070: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a080: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
a090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a0a0: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
a0b0: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
a0c0: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
a0d0: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
a0e0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
a0f0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
a100: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
a110: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
a120: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
a130: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78  e(&data[pc+2], x
a140: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
a150: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20       *pIdx = pc 
a160: 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74  + x;.        ret
a170: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
a180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a190: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
a1a0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  make sure there 
a1b0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
a1c0: 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73 61  in the gap to sa
a1d0: 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20 61  tisfy.  ** the a
a1e0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e  llocation.  If n
a1f0: 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a  ot, defragment..
a200: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
a210: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f   gap+2+nByte==to
a220: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
a230: 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20  +nByte>top ){.  
a240: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
a250: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
a260: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a270: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
a280: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
a290: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
a2a0: 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e     assert( gap+n
a2b0: 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d  Byte<=top );.  }
a2c0: 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ...  /* Allocate
a2d0: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
a2e0: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
a2f0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
a300: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
a310: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
a320: 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65   area.  The btre
a330: 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c  eInitPage() call
a340: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a   has already.  *
a350: 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  * validated the 
a360: 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e  freelist.  Given
a370: 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69   that the freeli
a380: 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65  st is valid, the
a390: 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61  re.  ** is no wa
a3a0: 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  y that the alloc
a3b0: 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64  ation can extend
a3c0: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
a3d0: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54  the page..  ** T
a3e0: 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
a3f0: 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70  w verifies the p
a400: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
a410: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20  ..  */.  top -= 
a420: 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74  nByte;.  put2byt
a430: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
a440: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
a450: 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e  top+nByte <= (in
a460: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
a470: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70  ableSize );.  *p
a480: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
a490: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a4a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
a4b0: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
a4c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
a4d0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
a4e0: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
a4f0: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
a500: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
a510: 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20  aDisk[start].** 
a520: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
a530: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69  the block is "si
a540: 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ze" bytes..**.**
a550: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66   Most of the eff
a560: 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f  ort here is invo
a570: 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e  lved in coalesin
a580: 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72  g adjacent.** fr
a590: 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61  ee blocks into a
a5a0: 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65   single big free
a5b0: 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   block..*/.stati
a5c0: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
a5d0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a5e0: 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73  int start, int s
a5f0: 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ize){.  int addr
a600: 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20  , pbegin, hdr;. 
a610: 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20   int iLast;     
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f     /* Largest po
a640: 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b  ssible freeblock
a650: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73   offset */.  uns
a660: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a670: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
a680: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a690: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
a6a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
a6b0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
a6c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
a6d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
a6e0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
a6f0: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
a700: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
a710: 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20  ssert( (start + 
a720: 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70 50  size) <= (int)pP
a730: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a740: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
a750: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a760: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
a770: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
a780: 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20  ert( size>=0 ); 
a790: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
a7a0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a  l size is 4 */..
a7b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
a7c0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
a7d0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
a7e0: 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69  {.    /* Overwri
a7f0: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
a800: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
a810: 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72  s when the secur
a820: 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20  e_delete.    ** 
a830: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
a840: 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
a850: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c  &data[start], 0,
a860: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f   size);.  }..  /
a870: 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20  * Add the space 
a880: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69  back into the li
a890: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65  nked list of fre
a8a0: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74  eblocks.  Note t
a8b0: 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68  hat.  ** even th
a8c0: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
a8d0: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
a8e0: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
a8f0: 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72  Page(),.  ** btr
a900: 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64  eeInitPage() did
a910: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
a920: 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72  lapping cells or
a930: 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73  .  ** freeblocks
a940: 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64   that overlapped
a950: 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f   cells.   Nor do
a960: 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65  es it detect whe
a970: 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20  n the.  ** cell 
a980: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63  content area exc
a990: 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69  eeds the value i
a9a0: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
a9b0: 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a  r.  If these.  *
a9c0: 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69  * situations ari
a9d0: 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  se, then subsequ
a9e0: 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61  ent insert opera
a9f0: 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72  tions might corr
aa00: 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65  upt.  ** the fre
aa10: 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f  elist.  So we do
aa20: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   need to check f
aa30: 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68  or corruption wh
aa40: 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a  ile scanning.  *
aa50: 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  * the freelist..
aa60: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
aa70: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
aa80: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
aa90: 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  .  iLast = pPage
aaa0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
aab0: 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28  e - 4;.  assert(
aac0: 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b   start<=iLast );
aad0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
aae0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
aaf0: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
ab00: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
ab10: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61      if( pbegin<a
ab20: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72  ddr+4 ){.      r
ab30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ab40: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
ab50: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67  .    addr = pbeg
ab60: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62  in;.  }.  if( pb
ab70: 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20  egin>iLast ){.  
ab80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ab90: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
aba0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67  }.  assert( pbeg
abb0: 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69  in>addr || pbegi
abc0: 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79  n==0 );.  put2by
abd0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  te(&data[addr], 
abe0: 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79  start);.  put2by
abf0: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  te(&data[start],
ac00: 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32   pbegin);.  put2
ac10: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
ac20: 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50  +2], size);.  pP
ac30: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
ac40: 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36  ge->nFree + (u16
ac50: 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61  )size;..  /* Coa
ac60: 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66  lesce adjacent f
ac70: 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ree blocks */.  
ac80: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
ac90: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
aca0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
acb0: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
acc0: 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73     int pnext, ps
acd0: 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65  ize, x;.    asse
ace0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
acf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ad00: 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70 50  begin <= (int)pP
ad10: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
ad20: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e  Size-4 );.    pn
ad30: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
ad40: 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20  data[pbegin]);. 
ad50: 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62     psize = get2b
ad60: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
ad70: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62  +2]);.    if( pb
ad80: 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33  egin + psize + 3
ad90: 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65   >= pnext && pne
ada0: 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  xt>0 ){.      in
adb0: 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d  t frag = pnext -
adc0: 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b   (pbegin+psize);
add0: 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67  .      if( (frag
ade0: 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e  <0) || (frag>(in
adf0: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29  t)data[hdr+7]) )
ae00: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
ae10: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ae20: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
ae30: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
ae40: 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20  -= (u8)frag;.   
ae50: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
ae60: 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20  &data[pnext]);. 
ae70: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
ae80: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b  ata[pbegin], x);
ae90: 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74  .      x = pnext
aea0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
aeb0: 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62  a[pnext+2]) - pb
aec0: 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32  egin;.      put2
aed0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
aee0: 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65  n+2], x);.    }e
aef0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20  lse{.      addr 
af00: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a  = pbegin;.    }.
af10: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
af20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
af30: 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  ea begins with a
af40: 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f   freeblock, remo
af50: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ve it. */.  if( 
af60: 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74  data[hdr+1]==dat
af70: 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61  a[hdr+5] && data
af80: 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+2]==data[hd
af90: 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  r+6] ){.    int 
afa0: 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20  top;.    pbegin 
afb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
afc0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65  [hdr+1]);.    me
afd0: 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31  mcpy(&data[hdr+1
afe0: 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  ], &data[pbegin]
aff0: 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20  , 2);.    top = 
b000: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
b010: 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74  dr+5]) + get2byt
b020: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
b030: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
b040: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
b050: 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  op);.  }.  asser
b060: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b070: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b080: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
b0b0: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
b0c0: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
b0d0: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
b0e0: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
b0f0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
b100: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
b110: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
b120: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
b130: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
b140: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
b150: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
b160: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
b170: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
b180: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
b190: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
b1a0: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
b1b0: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
b1c0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
b1d0: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
b1e0: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
b1f0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
b200: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
b210: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
b220: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
b230: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
b240: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
b250: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
b260: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
b270: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
b280: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
b290: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
b2a0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b2b0: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
b2c0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
b2d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b2e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b2f0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b300: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
b310: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
b320: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
b330: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
b340: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
b350: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
b360: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
b370: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
b380: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
b390: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
b3a0: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
b3b0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
b3c0: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61  TKEY) ){.    pPa
b3d0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
b3e0: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
b3f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
b400: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
b410: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
b420: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
b430: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
b440: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
b450: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
b460: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
b470: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
b480: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
b490: 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20  ->hasData = 0;. 
b4a0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
b4b0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
b4c0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
b4d0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
b4e0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
b4f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
b500: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b510: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
b520: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
b530: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
b540: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
b550: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b560: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
b570: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
b580: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
b590: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
b5a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b5b0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
b5c0: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
b5d0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
b5e0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
b5f0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
b600: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
b610: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
b620: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
b630: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
b640: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
b650: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
b660: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
b670: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
b680: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
b690: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
b6a0: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
b6b0: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
b6c0: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
b6d0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
b6e0: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
b6f0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
b700: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b710: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b720: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b740: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
b750: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
b760: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
b770: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b780: 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
b790: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
b7a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b7b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b7c0: 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
b7d0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
b7e0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b7f0: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
b800: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31  isInit ){.    u1
b810: 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  6 pc;           
b820: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
b830: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
b840: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
b850: 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20   */.    u8 hdr; 
b860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
b870: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
b880: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
b890: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61   */.    u8 *data
b8a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
b8b0: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
b8c0: 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61  ata */.    BtSha
b8d0: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
b8e0: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
b8f0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
b900: 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
b910: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
b920: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
b930: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
b940: 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  .    u16 cellOff
b950: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
b960: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
b970: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
b980: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
b990: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
b9a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b9b0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
b9c0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
b9d0: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
b9e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
b9f0: 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
ba00: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
ba10: 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73     int iCellFirs
ba20: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
ba30: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
ba40: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
ba50: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  t */.    int iCe
ba60: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
ba70: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
ba80: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
ba90: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42  ffset */..    pB
baa0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
bab0: 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
bac0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
bad0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bae0: 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65  Data;.    if( de
baf0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
bb00: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
bb10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bb20: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
bb30: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
bb40: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
bb50: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
bb60: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
bb70: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
bb80: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
bb90: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
bba0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
bbb0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
bbc0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
bbd0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
bbe0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
bbf0: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
bc00: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
bc10: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45     pPage->aDataE
bc20: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
bc30: 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67  eSize];.    pPag
bc40: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
bc50: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
bc60: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
bc70: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
bc80: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50  [hdr+5]);.    pP
bc90: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
bca0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
bcb0: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
bcc0: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
bcd0: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
bce0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
bcf0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
bd00: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
bd10: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
bd20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
bd30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bd40: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
bd50: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
bd60: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
bd70: 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d  ) );..    /* A m
bd80: 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
bd90: 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
bda0: 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
bdb0: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
bdc0: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
bdd0: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
bde0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
bdf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
be00: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
be10: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
be20: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
be30: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
be40: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
be50: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
be60: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
be70: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
be80: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
be90: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
bea0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
beb0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
bec0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
bed0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
bee0: 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65  Size - 4;.#if de
bef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
bf00: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
bf10: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20  L_CHECK).    {. 
bf20: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
bf30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
bf40: 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
bf50: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
bf60: 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
bf70: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bf80: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
bf90: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
bfa0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
bfb0: 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
bfc0: 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
bfd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
bfe0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
bff0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
c000: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
c010: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
c020: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
c030: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
c040: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
c050: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
c060: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c070: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c080: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c090: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c0a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c0b0: 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
c0c0: 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
c0d0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  pc]);.        te
c0e0: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
c0f0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c100: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
c110: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c120: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c130: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c140: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
c150: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
c160: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
c170: 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d  ellLast++;.    }
c180: 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f    .#endif..    /
c190: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
c1a0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
c1b0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
c1c0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c1d0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
c1e0: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
c1f0: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20  hdr+7] + top;.  
c200: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
c210: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
c220: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
c230: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
c240: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
c250: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  {.        /* Sta
c260: 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b  rt of free block
c270: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
c280: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
c290: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c2a0: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
c2b0: 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
c2c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
c2d0: 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  );.      size = 
c2e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
c2f0: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
c300: 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74   (next>0 && next
c310: 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20  <=pc+size+3) || 
c320: 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69  pc+size>usableSi
c330: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
c340: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
c350: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
c360: 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65  g order. And the
c370: 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20   last byte of.  
c380: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
c390: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
c3a0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
c3b0: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
c3c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c3d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c3e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
c3f0: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
c400: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
c410: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
c420: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
c430: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
c440: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c450: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
c460: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
c470: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c480: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
c490: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
c4a0: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
c4b0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c4c0: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
c4d0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
c4e0: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c4f0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c500: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c510: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c520: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c530: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c540: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c550: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c560: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c570: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c580: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c590: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c5a0: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c5b0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c5c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c5d0: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c5e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c5f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c600: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c610: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c620: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c630: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c640: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c650: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c660: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c670: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c680: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c690: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c6a0: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c6b0: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c6c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c6d0: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c6e0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c6f0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c700: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c710: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c720: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c730: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c740: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c750: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c760: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c770: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c780: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c790: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c7b0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c7c0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c7d0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c7e0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c7f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c800: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c810: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c820: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c830: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c840: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c850: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c860: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c870: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c880: 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
c890: 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
c8a0: 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65  DELETE ){.    me
c8b0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c8c0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c8d0: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c8e0: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c8f0: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c900: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c910: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c920: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c930: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c940: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c950: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c960: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c970: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c980: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c990: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c9a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c9b0: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c9c0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c9d0: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c9e0: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c9f0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
ca00: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
ca10: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
ca20: 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
ca30: 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
ca40: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
ca50: 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
ca60: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
ca70: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
ca80: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
ca90: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
caa0: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
cab0: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
cac0: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
cad0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
cae0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
caf0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
cb00: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
cb10: 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
cb20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
cb30: 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
cb40: 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
cb50: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
cb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
cb70: 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
cb80: 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
cb90: 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
cba0: 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
cbb0: 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
cbc0: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
cbd0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
cbe0: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
cbf0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
cc00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
cc10: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
cc20: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
cc30: 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61  = pDbPage;.  pPa
cc40: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
cc50: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
cc60: 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gno;.  pPage->hd
cc70: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  rOffset = pPage-
cc80: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
cc90: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   0;.  return pPa
cca0: 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
ccb0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
ccc0: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
ccd0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
cce0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
ccf0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
cd00: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
cd10: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
cd20: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
cd30: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
cd40: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
cd50: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
cd60: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
cd70: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
cd80: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
cd90: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
cda0: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
cdb0: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
cdc0: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
cdd0: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
cde0: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
cdf0: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
ce00: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
ce10: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
ce20: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
ce30: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
ce40: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
ce50: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
ce60: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
ce70: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
ce80: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
ce90: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
cea0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
ceb0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
cec0: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
ced0: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
cee0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cef0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
cf00: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
cf10: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
cf20: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
cf30: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
cf40: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  r */.  int noCon
cf50: 74 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 44  tent,       /* D
cf60: 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20  o not load page 
cf70: 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20  content if true 
cf80: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 6f 6e  */.  int bReadon
cf90: 6c 79 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ly        /* Tru
cfa0: 65 20 69 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e if a read-only
cfb0: 20 28 6d 6d 61 70 29 20 70 61 67 65 20 69 73 20   (mmap) page is 
cfc0: 6f 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ok */.){.  int r
cfd0: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
cfe0: 50 61 67 65 3b 0a 20 20 69 6e 74 20 66 6c 61 67  Page;.  int flag
cff0: 73 20 3d 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 3f  s = (noContent ?
d000: 20 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f 4e   PAGER_ACQUIRE_N
d010: 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 29 20 0a 20  OCONTENT : 0) . 
d020: 20 20 20 20 20 20 20 20 20 20 20 7c 20 28 62 52             | (bR
d030: 65 61 64 6f 6e 6c 79 20 3f 20 50 41 47 45 52 5f  eadonly ? PAGER_
d040: 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59  ACQUIRE_READONLY
d050: 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65 72 74   : 0);..  assert
d060: 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c  ( noContent==0 |
d070: 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29  | bReadonly==0 )
d080: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d090: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d0a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d0b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
d0c0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
d0d0: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
d0e0: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
d0f0: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
d100: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d110: 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
d120: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
d130: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
d140: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
d150: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d160: 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
d170: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
d180: 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
d190: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
d1a0: 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
d1b0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d1c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
d1d0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
d1e0: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
d1f0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
d200: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
d210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
d220: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
d230: 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
d240: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
d250: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
d260: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
d270: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d280: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d290: 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
d2a0: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
d2b0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
d2c0: 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
d2d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
d2e0: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
d2f0: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
d300: 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
d310: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d320: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
d330: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d340: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
d350: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
d360: 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
d370: 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
d380: 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
d390: 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65  tatic Pgno btree
d3a0: 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
d3b0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75  ed *pBt){.  retu
d3c0: 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  rn pBt->nPage;.}
d3d0: 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65  .u32 sqlite3Btre
d3e0: 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20  eLastPage(Btree 
d3f0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
d400: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
d410: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
d420: 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e  sert( ((p->pBt->
d430: 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30  nPage)&0x8000000
d440: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
d450: 20 28 69 6e 74 29 62 74 72 65 65 50 61 67 65 63   (int)btreePagec
d460: 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
d470: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
d480: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
d490: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
d4a0: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
d4b0: 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63  e is just a.** c
d4c0: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
d4d0: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
d4e0: 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  te calls to btre
d4f0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a  eGetPage() and .
d500: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
d510: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
d520: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
d530: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70  en the value *pp
d540: 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69  Page is set to i
d550: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
d560: 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
d570: 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
d580: 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
d590: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
d5a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
d5b0: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
d5c0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5e0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
d5f0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
d600: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
d610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d620: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
d630: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
d640: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
d650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
d660: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
d670: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  nter here */.  i
d680: 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20 20  nt bReadonly    
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6a0: 2a 20 54 72 75 65 20 69 66 20 61 20 72 65 61 64  * True if a read
d6b0: 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67  -only (mmap) pag
d6c0: 65 20 69 73 20 6f 6b 20 2a 2f 0a 29 7b 0a 20 20  e is ok */.){.  
d6d0: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
d6e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d6f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d700: 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
d710: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d720: 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
d730: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d740: 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
d750: 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
d760: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
d770: 70 50 61 67 65 2c 20 30 2c 20 62 52 65 61 64 6f  pPage, 0, bReado
d780: 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nly);.    if( rc
d790: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d7a0: 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49       rc = btreeI
d7b0: 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
d7c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d7d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d7e0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
d7f0: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
d800: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
d810: 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
d820: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d830: 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
d840: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
d850: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d860: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
d870: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
d880: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
d890: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
d8a0: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
d8b0: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
d8c0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
d8d0: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
d8e0: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
d8f0: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
d900: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
d910: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d920: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
d930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d940: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
d950: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
d960: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
d970: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
d980: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
d990: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d9a0: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
d9b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d9c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d9d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
d9e0: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
d9f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
da00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
da10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
da20: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
da30: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
da40: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
da50: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
da60: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
da70: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
da80: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
da90: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
daa0: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
dab0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
dac0: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
dad0: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
dae0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
daf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
db00: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
db10: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
db20: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
db30: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
db40: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
db50: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
db60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
db70: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
db80: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
db90: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
dba0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
dbb0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
dbc0: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
dbd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
dbe0: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
dbf0: 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
dc00: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
dc10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
dc20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
dc30: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
dc40: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
dc50: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
dc60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
dc70: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
dc80: 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
dc90: 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
dca0: 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
dcb0: 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
dcc0: 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
dcd0: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
dce0: 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
dcf0: 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
dd00: 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
dd10: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
dd20: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
dd30: 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
dd40: 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
dd50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
dd60: 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
dd70: 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
dd80: 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
dd90: 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
dda0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
ddb0: 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
ddc0: 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
ddd0: 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
dde0: 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
ddf0: 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
de00: 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
de10: 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
de20: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
de30: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
de40: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
de50: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
de60: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
de70: 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
de80: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
de90: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
dea0: 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
deb0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
dec0: 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
ded0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
dee0: 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
def0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
df00: 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
df10: 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
df20: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
df30: 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
df40: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
df50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
df60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
df70: 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
df80: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
df90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
dfa0: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
dfb0: 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
dfc0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
dfd0: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
dfe0: 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
dff0: 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
e000: 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
e010: 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
e020: 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
e030: 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
e040: 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
e050: 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
e060: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
e070: 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
e080: 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
e090: 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
e0a0: 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
e0b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
e0c0: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
e0d0: 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
e0e0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
e0f0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
e100: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
e110: 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
e120: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
e130: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
e140: 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
e150: 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
e160: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
e170: 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
e180: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
e190: 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
e1a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
e1b0: 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
e1c0: 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
e1d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
e1e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
e1f0: 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
e200: 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
e210: 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
e220: 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
e230: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
e240: 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
e250: 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
e260: 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
e270: 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
e280: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e290: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
e2a0: 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
e2b0: 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
e2c0: 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
e2d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
e2e0: 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
e2f0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
e300: 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
e310: 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
e320: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
e330: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
e340: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
e350: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
e360: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
e370: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
e380: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
e390: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
e3a0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
e3b0: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
e3c0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
e3d0: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
e3e0: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
e3f0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
e400: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
e410: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
e420: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
e430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
e440: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
e450: 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
e460: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
e470: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
e480: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e490: 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
e4a0: 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
e4b0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
e4e0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
e4f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
e500: 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
e510: 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
e520: 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
e530: 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
e540: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e560: 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
e570: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
e580: 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
e5b0: 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
e5c0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
e5d0: 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
e5e0: 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
e5f0: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
e600: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
e610: 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
e620: 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
e630: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
e640: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
e650: 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
e660: 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
e670: 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
e680: 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
e690: 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
e6a0: 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
e6b0: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
e6c0: 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
e6d0: 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
e6e0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
e6f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e700: 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
e710: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
e720: 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
e730: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
e740: 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
e750: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
e760: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
e790: 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
e7a0: 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
e7d0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
e7e0: 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
e7f0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
e800: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e810: 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
e820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e830: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
e840: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e850: 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
e860: 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
e870: 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
e880: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
e890: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
e8a0: 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
e8b0: 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
e8c0: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
e8d0: 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
e8e0: 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
e8f0: 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
e900: 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
e910: 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
e920: 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
e930: 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
e940: 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
e950: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
e960: 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
e970: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
e980: 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
e990: 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
e9a0: 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
e9b0: 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
e9c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
e9d0: 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
e9e0: 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
e9f0: 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
ea00: 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
ea10: 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
ea20: 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
ea30: 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
ea40: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
ea50: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
ea60: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
ea70: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
ea80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
ea90: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
eaa0: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
eab0: 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
eac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ead0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
eae0: 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
eaf0: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
eb00: 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
eb10: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
eb20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
eb30: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
eb40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
eb50: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
eb60: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
eb70: 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
eb80: 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
eb90: 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
eba0: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
ebb0: 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
ebc0: 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
ebd0: 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
ebe0: 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
ebf0: 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
ec00: 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
ec10: 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
ec20: 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
ec30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
ec40: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
ec50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
ec60: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
ec70: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
ec80: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
ec90: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
eca0: 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50  te3Malloc(nFullP
ecb0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
ecc0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
ecd0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
ece0: 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
ecf0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
ed00: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
ed10: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
ed20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ed30: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
ed40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ed50: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
ed60: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
ed70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
ed80: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
ed90: 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Filename, sqlite
eda0: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
edb0: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 7d  ame)+1);.      }
edc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
edd0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
ede0: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
edf0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
ee20: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
ee30: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ee40: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ee50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ee60: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ee70: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
ee80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
ee90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
eea0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
eeb0: 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
eec0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
eed0: 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
eee0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
eef0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
ef00: 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
ef10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ef20: 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
ef30: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
ef40: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
ef50: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
ef60: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
ef70: 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
ef80: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
ef90: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
efa0: 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
efb0: 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
efc0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
efd0: 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
efe0: 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
eff0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f000: 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
f010: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
f020: 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
f030: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
f040: 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
f050: 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
f070: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
f080: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
f090: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
f0a0: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
f0b0: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
f0c0: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
f0d0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
f0e0: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
f0f0: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
f100: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
f110: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
f120: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
f130: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
f140: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f150: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f160: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f170: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f180: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f190: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
f1a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
f1b0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
f1c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
f1d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f1e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f1f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f200: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
f210: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f220: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
f230: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
f240: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
f250: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
f260: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
f270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f280: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f290: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
f2b0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
f2c0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
f2d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
f2e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
f2f0: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
f300: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
f310: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
f320: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
f330: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
f340: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
f350: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
f360: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
f370: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
f380: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
f390: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
f3a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f3b0: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
f3c0: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
f3d0: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
f3e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f3f0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
f400: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f410: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
f420: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
f430: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
f440: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
f450: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
f460: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
f470: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
f480: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
f490: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
f4a0: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
f4b0: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
f4c0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
f4d0: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
f4e0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
f4f0: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
f500: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f510: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
f520: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
f530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f540: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
f550: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
f560: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f570: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
f580: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
f590: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
f5a0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f5b0: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
f5c0: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
f5d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
f5e0: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
f5f0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
f600: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f610: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
f620: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
f640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
f650: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
f660: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
f670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f680: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
f690: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
f6a0: 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
f6b0: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
f6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f6d0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f6e0: 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
f6f0: 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 6d 78  ->pPager, db->mx
f700: 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
f710: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
f720: 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
f730: 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
f740: 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
f750: 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
f760: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f770: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
f780: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f790: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
f7a0: 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
f7b0: 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
f7c0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
f7d0: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
f7e0: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
f7f0: 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
f800: 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
f810: 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
f820: 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
f830: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
f840: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
f850: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
f860: 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
f870: 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
f880: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
f890: 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
f8a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
f8b0: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
f8c0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
f8d0: 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
f8e0: 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ETE;.#endif.    
f8f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
f900: 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c  (zDbHeader[16]<<
f910: 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b  8) | (zDbHeader[
f920: 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
f930: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
f940: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
f950: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
f960: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
f970: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
f980: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
f990: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
f9a0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f9b0: 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
f9c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f9d0: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
f9e0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
f9f0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
fa00: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
fa10: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
fa20: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
fa30: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
fa40: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
fa50: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
fa60: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
fa70: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
fa80: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
fa90: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
faa0: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
fab0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
fac0: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
fad0: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
fae0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
faf0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
fb00: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
fb10: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
fb20: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
fb30: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
fb40: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
fb50: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
fb60: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
fb70: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
fb80: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
fb90: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
fba0: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
fbb0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
fbc0: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
fbd0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
fbe0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
fbf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
fc00: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
fc10: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
fc20: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
fc30: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
fc40: 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
fc50: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
fc60: 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
fc70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fc80: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
fc90: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
fca0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
fcb0: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
fcc0: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
fcd0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
fce0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
fcf0: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
fd00: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
fd10: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
fd20: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
fd30: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
fd40: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
fd50: 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
fd60: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
fd70: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
fd80: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
fd90: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
fda0: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
fdb0: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
fdc0: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
fdd0: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
fde0: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
fdf0: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
fe00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fe10: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
fe20: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
fe30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
fe40: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
fe50: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
fe60: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
fe70: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
fe80: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
fe90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
fea0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
feb0: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
fec0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
fed0: 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
fee0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
fef0: 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
ff00: 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
ff10: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
ff20: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
ff30: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
ff40: 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
ff50: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
ff60: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
ff70: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
ff80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
ff90: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
ffa0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
ffb0: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
ffc0: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
ffd0: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
ffe0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fff0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
10000 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
10010 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
10020 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
10030 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
10040 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10050 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10060 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
10070 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
10080 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
10090 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
100a0 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
100b0 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
100c0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
100d0 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
100e0 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
100f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
10100 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
10110 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
10120 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10130 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10140 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
10150 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
10160 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
10170 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
10180 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
10190 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
101a0 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
101b0 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
101c0 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
101d0 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
101e0 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
101f0 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
10200 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
10210 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
10220 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
10230 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
10240 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
10250 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
10260 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10270 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
10280 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
10290 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
102a0 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
102b0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
102c0 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
102d0 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
102e0 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
102f0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
10300 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
10310 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
10320 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
10330 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
10340 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
10350 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
10360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10370 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
10380 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
10390 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
103a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
103b0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
103c0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
103d0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
103e0 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
103f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
10400 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
10410 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
10420 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
10430 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
10440 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
10450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
10460 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
10470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10480 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10490 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
104a0 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
104b0 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
104c0 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
104d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
104e0 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
104f0 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
10500 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
10510 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10520 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
10530 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
10540 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
10550 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
10560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10570 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
10580 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
10590 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
105a0 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
105b0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
105c0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
105d0 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
105e0 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
105f0 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
10600 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
10610 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
10620 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
10630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10640 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
10650 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
10660 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10670 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
10680 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
10690 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
106a0 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
106b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
106c0 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
106d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
106e0 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
106f0 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
10700 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10710 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
10720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10730 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
10740 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
10750 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
10760 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
10770 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
10780 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
10790 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
107a0 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
107b0 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
107c0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
107d0 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
107e0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
107f0 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
10800 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
10810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
10820 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
10830 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
10840 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
10850 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10860 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
10870 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
10880 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
10890 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
108a0 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
108b0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
108c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
108d0 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
108e0 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
108f0 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
10900 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10910 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10920 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
10930 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10940 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
10950 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
10960 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
10970 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
10980 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10990 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
109a0 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
109b0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
109c0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
109d0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
109e0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
109f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
10a00 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
10a10 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10a20 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
10a30 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
10a40 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
10a50 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
10a60 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
10a70 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
10a80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
10a90 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
10aa0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
10ab0 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
10ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10ad0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
10ae0 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
10af0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10b00 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
10b10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
10b20 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
10b30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10b40 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
10b50 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
10b60 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
10b70 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10b80 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
10b90 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
10ba0 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
10bb0 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
10bc0 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
10bd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10be0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
10bf0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
10c00 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
10c10 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
10c20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
10c30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
10c40 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
10c50 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
10c60 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
10c70 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
10c80 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
10c90 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
10ca0 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10cb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
10cc0 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
10cd0 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
10ce0 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
10cf0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
10d00 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
10d10 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
10d20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
10d30 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
10d40 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
10d50 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10d60 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
10d70 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
10d80 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10d90 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
10da0 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
10db0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10dc0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
10dd0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
10de0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10df0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
10e00 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
10e10 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
10e20 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
10e30 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
10e40 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
10e50 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
10e60 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
10e70 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10e80 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
10e90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
10ea0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
10eb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
10ec0 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
10ed0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
10ee0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
10ef0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10f00 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
10f10 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
10f20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
10f30 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
10f40 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10f50 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  (p, SQLITE_OK);.
10f60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10f70 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
10f80 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
10f90 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
10fa0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
10fb0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10fc0 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
10fd0 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
10fe0 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
10ff0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
11000 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
11010 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
11020 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
11030 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
11040 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
11050 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
11060 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
11070 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
11080 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
11090 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
110a0 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
110b0 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
110c0 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
110d0 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
110e0 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
110f0 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
11100 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
11110 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
11120 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
11130 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11140 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
11150 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
11160 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
11170 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
11180 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
11190 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
111a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
111b0 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
111c0 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
111d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
111e0 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
111f0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
11200 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
11210 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
11220 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
11230 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
11240 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
11250 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
11260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
11270 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
11280 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
11290 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
112a0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
112b0 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
112c0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
112d0 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
112e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
112f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11300 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11310 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
11320 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
11330 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
11340 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
11350 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
11360 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
11370 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
11380 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
11390 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
113a0 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
113b0 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
113c0 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
113d0 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
113e0 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
113f0 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
11400 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
11410 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
11420 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
11430 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
11440 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
11450 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
11460 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
11470 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
11480 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
11490 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
114a0 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
114b0 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
114c0 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
114d0 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
114e0 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
114f0 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
11500 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
11510 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
11520 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
11530 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
11540 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
11550 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
11560 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
11570 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
11580 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
11590 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
115a0 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
115b0 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
115c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
115d0 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
115e0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
115f0 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
11600 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11620 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11630 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
11640 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11650 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
11660 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
11670 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
11680 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
11690 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
116a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
116b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
116c0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
116d0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
116e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
116f0 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
11700 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
11710 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11720 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
11730 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
11740 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70 29 7b  3_int64 mxMmap){
11750 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11760 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11770 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11780 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
11790 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
117a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
117b0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
117c0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
117d0 3e 70 50 61 67 65 72 2c 20 6d 78 4d 6d 61 70 29  >pPager, mxMmap)
117e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
117f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11800 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11810 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11820 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
11830 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
11840 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
11850 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
11860 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
11870 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
11880 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
11890 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
118a0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
118b0 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
118c0 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
118d0 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
118e0 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
118f0 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
11900 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
11910 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
11920 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
11930 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
11940 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
11950 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
11960 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
11970 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
11980 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
11990 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
119a0 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
119b0 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
119c0 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
119d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
119e0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
119f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11a00 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
11a10 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
11a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11a30 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68   btree to set th
11a40 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f  e safety level o
11a50 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c  n */.  int level
11a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11a70 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
11a80 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e  ous.  1=OFF, 2=N
11a90 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f  ORMAL, 3=FULL */
11aa0 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  .  int fullSync,
11ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
11ac0 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 2e 20 2a  GMA fullfsync. *
11ad0 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46 75 6c 6c  /.  int ckptFull
11ae0 53 79 6e 63 20 20 20 20 20 20 20 2f 2a 20 50 52  Sync       /* PR
11af0 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f  AGMA checkpoint_
11b00 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20  fullfync */.){. 
11b10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11b20 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
11b30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11b40 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11b50 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11b60 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76   level>=1 && lev
11b70 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74  el<=3 );.  sqlit
11b80 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11b90 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
11ba0 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
11bb0 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c  t->pPager, level
11bc0 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70 74  , fullSync, ckpt
11bd0 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  FullSync);.  sql
11be0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11bf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11c00 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
11c10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
11c20 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
11c30 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
11c40 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
11c50 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
11c60 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
11c70 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
11c80 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
11c90 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
11ca0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
11cb0 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
11cc0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11cd0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
11ce0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
11cf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11d00 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
11d10 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
11d20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11d30 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
11d40 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
11d50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11d60 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
11d70 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
11d80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11d90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11da0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
11db0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
11dc0 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
11dd0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
11de0 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
11df0 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
11e00 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
11e10 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
11e20 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11e30 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
11e40 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
11e50 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
11e60 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
11e70 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
11e80 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
11e90 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
11ea0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
11eb0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
11ec0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
11ed0 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
11ee0 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
11ef0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
11f00 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
11f10 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
11f20 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
11f30 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
11f40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11f50 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
11f60 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
11f70 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
11f80 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
11f90 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
11fa0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
11fb0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
11fc0 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
11fd0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
11fe0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
11ff0 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
12000 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
12010 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
12020 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
12030 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
12040 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
12050 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
12060 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
12070 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
12080 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
12090 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
120a0 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
120b0 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
120c0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
120d0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
120e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
120f0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
12100 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
12110 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
12120 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
12130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12140 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12150 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
12160 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
12170 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
12180 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
12190 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
121a0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
121b0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
121c0 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
121d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
121e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
121f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12200 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
12210 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
12220 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
12230 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
12240 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
12250 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
12260 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
12270 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
12280 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
12290 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
122a0 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
122b0 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
122c0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
122d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
122e0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
122f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
12300 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26   !pBt->pPage1 &&
12310 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
12320 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
12330 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
12340 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
12350 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
12360 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12370 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
12380 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
12390 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
123a0 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
123b0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
123c0 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
123d0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
123e0 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
123f0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
12400 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
12410 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12420 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
12440 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
12450 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
12460 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
12470 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
12480 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
12490 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
124a0 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eSize;.}..#if de
124b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
124c0 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e  _CODEC) || defin
124d0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
124e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
124f0 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
12500 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
12510 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
12520 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
12530 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
12540 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
12550 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
12560 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
12570 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
12580 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
12590 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
125a0 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
125b0 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
125c0 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
125d0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
125e0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
125f0 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
12600 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
12610 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
12620 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
12630 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
12640 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
12650 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
12660 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
12670 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
12680 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
12690 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
126a0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
126b0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
126c0 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
126d0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
126e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
126f0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
12700 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
12710 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
12720 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12730 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12740 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
12750 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
12760 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
12770 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12780 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c  ITE_HAS_CODEC ||
12790 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
127a0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
127b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
127c0 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
127d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
127e0 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
127f0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
12800 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
12810 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
12820 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
12830 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
12840 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
12850 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
12860 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
12870 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
12880 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
12890 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  ensions..*/.int 
128a0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
128b0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
128c0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
128d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
128e0 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
128f0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
12900 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
12910 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12920 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12930 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
12940 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
12950 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
12960 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
12970 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
12980 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
12990 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
129a0 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
129b0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
129c0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
129d0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
129e0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
129f0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
12a00 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
12a10 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
12a20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
12a30 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
12a40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12a50 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
12a60 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
12a70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
12a80 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
12a90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12aa0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
12ab0 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53  ** Set the BTS_S
12ac0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61  ECURE_DELETE fla
12ad0 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  g if newFlag is 
12ae0 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46  0 or 1.  If newF
12af0 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68  lag is -1,.** th
12b00 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  en make no chang
12b10 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  es.  Always retu
12b20 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
12b30 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
12b40 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67  ELETE.** setting
12b50 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
12b60 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
12b70 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
12b80 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
12b90 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
12ba0 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
12bb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
12bc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12bd0 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
12be0 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
12bf0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
12c00 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
12c10 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c  E;.    if( newFl
12c20 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73  ag ) p->pBt->bts
12c30 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
12c40 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20  URE_DELETE;.  } 
12c50 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
12c60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
12c70 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30  ECURE_DELETE)!=0
12c80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12c90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12ca0 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn b;.}.#endif /
12cb0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
12cc0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
12cd0 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
12ce0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
12cf0 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
12d00 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
12d10 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
12d20 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
12d30 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
12d40 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
12d50 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
12d60 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
12d70 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
12d80 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
12d90 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
12da0 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
12db0 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
12dc0 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
12dd0 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
12de0 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
12df0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
12e00 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
12e10 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
12e20 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
12e30 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
12e40 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
12e50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12e60 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
12e70 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
12e80 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
12e90 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
12ea0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12eb0 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
12ec0 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
12ed0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12ee0 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
12ef0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
12f00 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
12f10 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
12f20 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
12f30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12f40 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
12f50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
12f60 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
12f70 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
12f80 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
12f90 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
12fa0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12fb0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12fc0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12fd0 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
12fe0 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
12ff0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
13000 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
13010 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
13020 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
13030 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
13040 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
13050 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
13060 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
13070 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13080 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
13090 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
130a0 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
130b0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
130c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
130d0 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
130e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
130f0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
13100 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
13110 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
13120 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
13130 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
13140 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
13150 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
13160 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13170 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
13180 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
13190 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
131a0 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
131b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
131c0 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
131d0 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
131e0 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
131f0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
13200 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
13210 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
13220 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
13230 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
13240 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
13250 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
13260 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
13270 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
13280 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
13290 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
132a0 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
132b0 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
132c0 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
132d0 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
132e0 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
132f0 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
13300 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
13310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13320 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
13330 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
13340 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
13350 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
13360 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
13370 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
13380 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
13390 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
133a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
133b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46   */.  int nPageF
133c0 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
133d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
133e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
133f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
13400 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
13410 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
13420 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
13430 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
13440 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
13450 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13460 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13470 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
13480 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
13490 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
134a0 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
134b0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
134c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
134d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
134e0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
134f0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
13500 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
13510 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
13520 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
13530 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
13540 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
13550 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
13560 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
13570 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
13580 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
13590 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
135a0 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
135b0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
135c0 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
135d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
135e0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
135f0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
13600 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
13610 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
13620 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
13630 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
13640 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
13650 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
13660 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
13670 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
13680 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
13690 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
136a0 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
136b0 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
136c0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
136d0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
136e0 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
136f0 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
13700 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13710 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13720 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13730 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
13740 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
13750 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13760 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
13770 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
13780 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
13790 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
137a0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
137b0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
137c0 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
137d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
137e0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
137f0 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
13800 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13810 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
13820 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13830 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
13840 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
13850 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
13860 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
13870 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
13880 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
13890 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
138a0 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
138b0 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
138c0 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
138d0 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
138e0 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
138f0 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
13900 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
13910 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
13920 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
13930 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
13940 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
13950 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
13960 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
13970 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
13980 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
13990 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
139a0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
139b0 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
139c0 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
139d0 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
139e0 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
139f0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
13a00 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13a10 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
13a20 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
13a30 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
13a40 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
13a50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13a60 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
13a70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
13a80 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
13a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13aa0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
13ab0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13ac0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13ad0 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  ( isOpen==0 ){. 
13ae0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
13af0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
13b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13b10 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
13b20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13b30 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
13b40 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
13b50 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
13b60 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13b70 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
13b80 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
13b90 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
13ba0 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
13bb0 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
13bc0 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
13bd0 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
13be0 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
13bf0 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
13c00 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
13c10 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
13c20 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
13c30 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
13c40 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
13c50 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
13c60 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
13c70 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
13c80 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
13c90 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
13ca0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
13cb0 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
13cc0 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
13cd0 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
13ce0 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
13cf0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
13d00 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
13d10 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
13d20 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
13d30 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
13d40 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
13d50 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13d60 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13d70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
13d80 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
13d90 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
13da0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
13db0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
13dc0 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
13dd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
13de0 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
13df0 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
13e00 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
13e10 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
13e20 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
13e30 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
13e40 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
13e50 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
13e60 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
13e70 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
13e80 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
13e90 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
13ea0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
13eb0 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
13ec0 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
13ed0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
13ee0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
13ef0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
13f00 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
13f10 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
13f20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
13f30 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
13f40 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
13f50 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
13f60 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
13f70 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
13f80 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
13f90 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
13fa0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
13fb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13fc0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
13fd0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
13fe0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
14020 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
14030 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14040 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
14050 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
14060 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
14070 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
14080 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
14090 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
140a0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
140b0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
140c0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
140d0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
140e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
140f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14100 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
14110 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
14120 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
14130 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
14140 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
14150 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14160 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
14170 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
14180 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
14190 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
141a0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
141b0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
141c0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
141d0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
141e0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
141f0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
14200 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
14210 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
14220 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
14230 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
14240 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
14250 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
14260 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
14270 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
14280 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
14290 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
142a0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
142b0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
142c0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
142d0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
142e0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
142f0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
14300 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
14310 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
14320 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
14330 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
14340 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
14350 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
14360 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
14370 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
14380 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
14390 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
143a0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
143b0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
143c0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
143d0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
143e0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
143f0 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
14400 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
14410 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
14420 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
14430 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
14440 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
14450 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
14460 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
14470 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
14480 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
14490 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
144a0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
144b0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
144c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
144d0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
144e0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
144f0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
14500 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
14510 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
14520 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
14530 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
14540 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
14550 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
14560 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
14570 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
14580 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
14590 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
145a0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
145b0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
145c0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
145d0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
145e0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
145f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
14600 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
14610 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
14620 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
14630 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
14640 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
14650 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
14660 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
14670 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
14680 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
14690 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
146a0 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
146b0 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
146c0 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
146d0 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
146e0 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
146f0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
14700 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
14710 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
14720 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
14730 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
14740 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
14750 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
14760 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
14770 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14780 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
14790 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
147a0 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
147b0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
147c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
147d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
147e0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
147f0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30   pBt->pCursor==0
14800 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
14810 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
14820 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
14830 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
14840 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
14850 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
14860 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14870 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
14880 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
14890 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
148a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
148b0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
148c0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
148d0 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  ata );.    relea
148e0 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67  sePage(pBt->pPag
148f0 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  e1);.    pBt->pP
14900 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  age1 = 0;.  }.}.
14910 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
14920 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
14930 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
14940 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
14950 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
14960 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
14970 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
14980 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
14990 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
149a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
149b0 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
149c0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
149d0 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
149e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
149f0 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
14a00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14a10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
14a20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
14a30 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
14a40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14a50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
14a60 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
14a70 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
14a80 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
14a90 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
14aa0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
14ab0 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
14ac0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
14ad0 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
14ae0 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
14af0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
14b00 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
14b10 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
14b20 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
14b30 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
14b40 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
14b50 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
14b60 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
14b70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
14b80 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
14b90 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
14ba0 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
14bb0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
14bc0 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
14bd0 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
14be0 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
14bf0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
14c00 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
14c10 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
14c20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
14c30 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
14c40 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
14c50 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
14c60 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
14c70 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
14c80 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
14c90 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
14ca0 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
14cb0 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
14cc0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
14cd0 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
14ce0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14cf0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
14d00 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
14d10 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
14d20 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
14d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
14d40 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
14d50 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
14d60 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
14d70 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
14d80 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
14d90 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
14da0 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
14db0 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
14dc0 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
14dd0 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
14de0 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
14df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
14e10 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
14e20 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
14e30 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
14e40 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
14e50 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
14e60 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
14e70 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
14e80 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
14e90 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
14ea0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
14eb0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
14ec0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
14ed0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
14ee0 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
14ef0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
14f00 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14f10 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
14f20 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
14f30 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
14f40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14f50 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
14f60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14f70 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
14f80 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
14f90 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
14fa0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
14fb0 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
14fc0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
14fd0 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
14fe0 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
14ff0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
15000 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15010 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
15020 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
15030 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
15040 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
15050 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
15060 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
15070 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
15080 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
15090 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
150a0 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
150b0 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
150c0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
150d0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
150e0 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
150f0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
15100 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
15110 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
15120 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
15130 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
15140 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
15150 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
15160 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
15170 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
15180 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
15190 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
151a0 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
151b0 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
151c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
151d0 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
151e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
151f0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
15200 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
15210 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
15220 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
15230 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
15240 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
15250 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
15260 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
15270 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
15280 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
15290 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
152a0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
152b0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
152c0 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
152d0 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
152e0 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
152f0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
15300 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
15310 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
15320 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
15330 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
15340 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
15350 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
15360 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
15370 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
15380 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
15390 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
153a0 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
153b0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
153c0 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
153d0 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
153e0 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
153f0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
15400 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
15410 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
15420 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
15430 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
15440 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
15450 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
15460 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
15470 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
15480 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
15490 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
154a0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
154b0 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
154c0 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
154d0 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
154e0 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
154f0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
15500 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
15510 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
15520 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
15530 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
15540 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
15550 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
15560 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
15570 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
15580 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
15590 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
155a0 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
155b0 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
155c0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
155d0 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
155e0 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
155f0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
15600 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15610 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
15620 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
15630 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
15640 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
15650 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15660 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
15670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
15680 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15690 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
156a0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
156b0 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
156c0 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
156d0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
156e0 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
156f0 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
15700 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
15710 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
15720 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
15730 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
15740 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
15750 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
15760 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
15770 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
15780 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
15790 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
157a0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
157b0 73 73 65 72 74 28 20 49 66 4e 6f 74 4f 6d 69 74  ssert( IfNotOmit
157c0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
157d0 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ate)==0 );..  /*
157e0 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
157f0 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
15800 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
15810 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
15820 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
15830 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
15840 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c  ONLY)!=0 && wrfl
15850 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
15860 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
15870 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
15880 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
15890 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
158a0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
158b0 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
158c0 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
158d0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
158e0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
158f0 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
15900 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
15910 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
15920 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
15930 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
15940 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
15950 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
15960 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
15970 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
15980 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
15990 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42  WRITE).   || (pB
159a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
159b0 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20  S_PENDING)!=0.  
159c0 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  ){.    pBlock = 
159d0 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
159e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72  ;.  }else if( wr
159f0 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
15a00 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
15a10 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
15a20 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
15a30 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
15a40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
15a50 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
15a60 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  .        pBlock 
15a70 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
15a80 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >db;.        bre
15a90 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15aa0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f  }.  }.  if( pBlo
15ab0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
15ac0 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
15ad0 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
15ae0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
15af0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
15b00 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20  CACHE;.    goto 
15b10 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
15b20 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
15b30 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
15b40 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
15b50 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
15b60 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
15b70 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
15b80 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
15b90 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
15ba0 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
15bb0 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
15bc0 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
15bd0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
15be0 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
15bf0 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
15c00 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
15c10 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
15c20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
15c30 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
15c40 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
15c50 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
15c60 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
15c70 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
15c80 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
15c90 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
15ca0 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
15cb0 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
15cc0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
15cd0 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
15ce0 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
15cf0 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
15d00 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
15d10 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
15d20 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
15d30 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
15d40 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
15d50 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
15d60 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
15d70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
15d80 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
15d90 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
15da0 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
15db0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
15dc0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
15dd0 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
15de0 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
15df0 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
15e00 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
15e10 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
15e20 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
15e30 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
15e40 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
15e50 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
15e60 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
15e70 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
15e80 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
15e90 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
15ea0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15eb0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
15ec0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
15ed0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
15ee0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
15ef0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
15f00 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
15f10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15f20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15f30 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
15f40 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
15f50 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
15f60 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
15f70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
15f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15f90 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
15fa0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
15fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15fc0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
15fd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15fe0 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
15ff0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
16000 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
16010 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
16020 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
16030 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
16040 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
16050 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
16060 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
16070 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
16080 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16090 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
160a0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
160b0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
160c0 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
160d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
160e0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
160f0 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
16100 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16110 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
16120 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
16130 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
16140 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
16150 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
16160 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
16170 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
16180 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
16190 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
161a0 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
161b0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
161c0 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
161d0 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
161e0 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
161f0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
16200 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
16210 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
16220 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
16230 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
16240 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
16250 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
16260 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
16270 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
16280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
16290 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
162a0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
162b0 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
162c0 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
162d0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
162e0 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
162f0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
16300 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
16310 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16320 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
16330 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
16340 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
16350 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
16360 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
16370 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
16380 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
16390 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
163a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
163b0 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
163c0 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
163d0 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
163e0 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
163f0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
16400 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
16410 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
16420 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
16430 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
16440 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
16450 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
16460 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
16470 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
16480 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
16490 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
164a0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
164b0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
164c0 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
164d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
164e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
164f0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
16500 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
16510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16520 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
16530 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
16540 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
16550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16560 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
16570 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
16580 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16590 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
165a0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
165b0 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
165c0 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
165d0 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
165e0 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
165f0 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
16600 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
16610 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
16620 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
16630 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
16640 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
16650 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
16660 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
16670 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
16680 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
16690 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
166a0 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
166b0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
166c0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
166d0 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
166e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
166f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
16700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16710 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
16720 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
16730 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
16740 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
16750 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
16760 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
16770 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
16780 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
16790 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
167a0 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
167b0 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
167c0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
167d0 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
167e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
167f0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
16800 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
16810 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
16840 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
16850 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16870 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
16880 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
16890 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
168c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
168d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
168e0 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49  e->pBt;.  u8 isI
168f0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
16900 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
16910 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
16920 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
16930 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16940 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
16950 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  tex) );.  rc = b
16960 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
16970 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
16980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16990 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
169a0 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a  trmaps_out;.  }.
169b0 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
169c0 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
169d0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
169e0 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
169f0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
16a00 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d  e, i);..    ptrm
16a10 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
16a20 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ge, pCell, &rc);
16a30 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
16a40 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
16a50 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
16a60 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
16a70 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  ;.      ptrmapPu
16a80 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
16a90 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
16aa0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
16ab0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
16ac0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
16ad0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
16ae0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
16af0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
16b00 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
16b10 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
16b20 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
16b30 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
16b40 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f   &rc);.  }..set_
16b50 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
16b60 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
16b70 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
16b80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16b90 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
16ba0 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70   on pPage is a p
16bb0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
16bc0 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68  From.  Modify th
16bd0 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a  is pointer so.**
16be0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
16bf0 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  to iTo. Paramete
16c00 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
16c10 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
16c20 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d  inter to.** be m
16c30 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c  odified, as  fol
16c40 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
16c50 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
16c60 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
16c70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
16c80 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
16c90 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
16ca0 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
16cb0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
16cc0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
16cd0 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
16ce0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
16cf0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
16d00 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
16d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
16d20 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
16d30 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
16d40 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
16d50 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
16d60 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
16d70 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
16d80 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
16d90 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16db0 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
16dc0 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
16dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
16de0 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
16df0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
16e00 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
16e10 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
16e20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16e30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
16e40 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
16e50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16e60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
16e70 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
16e80 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ge) );.  if( eTy
16e90 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
16ea0 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
16eb0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
16ec0 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
16ed0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
16ee0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
16ef0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
16f00 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
16f10 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
16f20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16f30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
16f40 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
16f50 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
16f60 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
16f70 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69      u8 isInitOri
16f80 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
16f90 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
16fa0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20    int nCell;..  
16fb0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
16fc0 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c  pPage);.    nCel
16fd0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
16fe0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
16ff0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
17000 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
17010 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
17020 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
17030 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
17040 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
17050 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
17060 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
17070 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
17080 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
17090 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
170a0 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20  o.iOverflow.    
170b0 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e       && pCell+in
170c0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d  fo.iOverflow+3<=
170d0 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
170e0 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20  ge->maskPage.   
170f0 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d        && iFrom==
17100 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
17110 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
17120 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
17130 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
17140 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
17150 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
17160 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
17180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
17190 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
171a0 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
171b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
171c0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
171d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
171e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
171f0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
17200 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
17210 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
17220 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
17230 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
17240 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
17250 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
17260 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
17270 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17280 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
172a0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
172b0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
172c0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
172d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
172e0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
172f0 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
17300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17310 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
17320 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
17330 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
17340 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
17350 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
17360 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
17370 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
17380 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
17390 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
173a0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
173b0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
173c0 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
173d0 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
173e0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
173f0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
17400 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
17410 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
17420 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
17430 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
17440 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
17450 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
17460 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
17470 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17480 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
17490 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
174a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
174b0 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
174c0 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
174d0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
174e0 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
174f0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
17500 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
17510 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
17520 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
17530 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
17540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
17550 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
17560 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
17570 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
17580 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
17590 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
175a0 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
175b0 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
175c0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
175d0 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
175e0 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
175f0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17600 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
17610 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
17620 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
17630 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
17640 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
17650 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
17660 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
17670 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
17680 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
17690 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
176a0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
176b0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
176c0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
176d0 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
176e0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
176f0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
17700 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
17710 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
17720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17730 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
17740 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
17750 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
17760 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
17770 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
17780 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
17790 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
177a0 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
177b0 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
177c0 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
177d0 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
177e0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
177f0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
17800 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
17810 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
17820 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
17830 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
17840 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
17850 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
17860 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
17870 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17890 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
178a0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
178b0 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
178c0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
178d0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
178e0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
178f0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
17900 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
17910 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
17920 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
17930 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
17940 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
17950 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
17960 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
17970 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
17980 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
17990 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
179a0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
179b0 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
179c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
179d0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
179e0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
179f0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
17a00 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
17a10 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
17a20 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
17a30 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
17a40 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
17a50 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
17a60 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
17a70 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
17a80 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
17a90 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
17aa0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
17ab0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17ac0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17ad0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
17ae0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
17af0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
17b00 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
17b10 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
17b20 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
17b30 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
17b40 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
17b50 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
17b60 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
17b70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17b80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
17b90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
17ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17bb0 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
17bc0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
17bd0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
17be0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
17bf0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
17c00 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
17c10 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
17c20 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
17c30 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
17c40 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
17c50 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
17c60 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
17c70 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
17c80 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
17c90 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
17ca0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
17cb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17cc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17cd0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
17ce0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
17cf0 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
17d00 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
17d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17d20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17d30 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
17d40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17d50 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
17d60 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
17d70 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
17d80 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
17d90 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
17da0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
17db0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
17dd0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
17de0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
17df0 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
17e00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17e10 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
17e20 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
17e30 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
17e40 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
17e50 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
17e60 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
17e70 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
17e80 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
17e90 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
17ea0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
17eb0 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
17ec0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
17ed0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
17ee0 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
17ef0 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
17f00 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
17f10 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70  d therefore no p
17f20 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c  oint in .** call
17f30 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
17f40 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
17f50 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72   SQLITE_DONE. Or
17f60 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  , if an error .*
17f70 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
17f80 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
17f90 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  r code..**.** Mo
17fa0 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74  re specificly, t
17fb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
17fc0 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
17fd0 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
17fe0 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
17ff0 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
18000 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
18010 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
18020 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
18030 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
18040 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
18050 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
18060 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
18070 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
18080 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
18090 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
180a0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
180b0 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
180c0 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
180d0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
180e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
180f0 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
18100 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
18110 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
18120 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
18130 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
18140 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
18150 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
18160 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
18170 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
18180 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69  vacuum-on-commmi
18190 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
181a0 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
181b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
181c0 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
181d0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
181e0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
181f0 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
18200 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
18210 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
18220 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
18230 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18240 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
18250 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
18260 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
18270 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18280 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
18290 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
182a0 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
182b0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
182c0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
182d0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
182e0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
182f0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
18300 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
18310 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
18320 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
18330 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
18340 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
18350 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
18360 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
18370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
18380 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
18390 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
183a0 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
183b0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
183c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
183d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
183e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
183f0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
18400 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
18410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18420 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18430 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
18440 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
18450 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
18460 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
18470 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
18480 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
18490 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
184a0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
184b0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
184c0 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
184d0 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
184e0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
184f0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
18500 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
18510 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
18520 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
18530 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
18540 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
18550 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
18560 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
18570 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
18580 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
18590 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
185a0 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
185b0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
185c0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
185d0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
185e0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
185f0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
18600 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
18610 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
18620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18640 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
18650 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
18660 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
18670 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
18680 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
18690 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
186a0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
186b0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
186c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
186d0 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
186e0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
186f0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
18700 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
18710 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
18720 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
18730 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
18740 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
18750 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
18760 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
18770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
18780 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
18790 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
187a0 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
187b0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
187c0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
187d0 20 26 70 4c 61 73 74 50 67 2c 20 30 2c 20 30 29   &pLastPg, 0, 0)
187e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
187f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18800 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18810 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
18820 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
18830 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
18840 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
18850 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
18860 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
18870 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
18880 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
18890 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
188a0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
188b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
188c0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
188d0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
188e0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
188f0 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
18900 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
18910 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
18920 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
18930 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
18940 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
18950 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
18960 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18970 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
18980 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
18990 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
189a0 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
189b0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
189c0 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
189d0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
189e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
189f0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
18a00 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
18a10 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
18a20 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
18a30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18a40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18a50 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
18a60 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
18a70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
18a80 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
18a90 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
18aa0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
18ab0 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
18ac0 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
18ad0 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
18ae0 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
18af0 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
18b00 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
18b10 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
18b20 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
18b30 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
18b40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
18b50 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
18b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18b70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
18b80 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
18b90 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
18ba0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
18bb0 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
18bc0 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
18bd0 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
18be0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
18bf0 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
18c00 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
18c10 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
18c20 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
18c30 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
18c40 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
18c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
18c70 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
18c80 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
18c90 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
18ca0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
18cb0 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
18cc0 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
18cd0 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
18ce0 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
18cf0 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
18d00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18d10 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
18d20 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
18d30 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
18d40 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
18d50 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
18d60 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
18d70 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
18d80 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18da0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
18db0 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
18dc0 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
18dd0 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18df0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
18e00 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
18e10 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
18e20 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
18e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18e40 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
18e50 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
18e60 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
18e70 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
18e80 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
18e90 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
18ea0 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
18eb0 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
18ec0 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
18ed0 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
18ee0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18ef0 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
18f00 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
18f10 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
18f20 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
18f30 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
18f40 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
18f50 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18f60 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
18f70 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
18f80 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
18f90 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
18fa0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
18fb0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
18fc0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
18fd0 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
18fe0 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
18ff0 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
19000 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
19010 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
19020 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
19030 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
19040 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
19050 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
19060 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
19070 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
19080 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
19090 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
190a0 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
190b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
190c0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
190d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
190e0 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
190f0 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
19100 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
19110 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
19120 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19130 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
19140 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
19150 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
19160 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
19170 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
19180 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19190 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
191a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
191b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
191c0 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
191d0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
191e0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
191f0 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
19200 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
19210 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
19220 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
19230 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
19240 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
19250 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
19260 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
19270 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19280 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
19290 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
192a0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
192b0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
192c0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
192d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
192e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
192f0 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
19300 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
19310 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
19320 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
19330 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
19340 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
19350 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19360 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
19370 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19380 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
19390 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
193a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
193b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
193c0 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
193d0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
193e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
193f0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
19400 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
19410 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19420 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19430 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19440 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
19450 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
19460 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
19470 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
19480 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
19490 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
194a0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
194b0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
194c0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
194d0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
194e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
194f0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
19500 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
19510 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
19520 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
19530 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
19540 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
19550 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
19560 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
19570 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
19580 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
19590 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
195a0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
195b0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
195c0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
195d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
195e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
195f0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
19600 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
19610 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
19620 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
19630 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
19640 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
19650 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
19660 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
19670 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
19680 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
19690 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
196a0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
196b0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
196c0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
196d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
196e0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
196f0 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
19700 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
19710 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
19720 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
19730 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
19740 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
19750 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
19760 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
19770 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
19780 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
19790 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
197a0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
197b0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
197c0 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
197d0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
197e0 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
197f0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
19800 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
19810 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
19820 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
19830 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
19840 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
19850 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
19860 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
19870 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
19880 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
19890 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
198a0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
198b0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
198c0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
198d0 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
198e0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
198f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
19900 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
19910 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
19920 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
19930 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
19940 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
19950 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
19960 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
19970 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
19980 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
19990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
199a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
199b0 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
199c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
199d0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
199e0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
199f0 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
19a00 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
19a10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
19a20 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
19a30 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
19a40 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
19a50 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
19a60 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
19a70 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
19a80 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
19a90 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
19aa0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
19ab0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
19ac0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
19ad0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
19ae0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
19af0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
19b00 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
19b10 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
19b20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
19b30 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
19b40 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
19b50 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
19b60 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
19b70 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
19b80 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
19b90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19ba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
19bb0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
19bc0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
19bd0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
19be0 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
19bf0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
19c00 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
19c10 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
19c20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19c30 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
19c40 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
19c50 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
19c60 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
19c70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19c80 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
19c90 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
19ca0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
19cb0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
19cc0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
19cd0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
19ce0 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
19cf0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
19d00 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
19d10 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
19d20 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
19d30 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
19d40 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
19d50 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
19d60 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
19d70 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
19d80 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
19d90 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
19da0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
19db0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
19dc0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
19dd0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
19de0 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
19df0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
19e00 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
19e10 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
19e20 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
19e30 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
19e40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
19e50 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
19e60 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
19e70 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
19e80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
19e90 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
19ea0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
19eb0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
19ec0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
19ed0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
19ee0 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
19ef0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
19f00 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
19f10 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
19f20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
19f30 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
19f40 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
19f50 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
19f60 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
19f70 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
19f80 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
19f90 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
19fa0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
19fb0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
19fc0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
19fd0 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
19fe0 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
19ff0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1a000 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1a010 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1a020 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
1a030 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
1a040 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
1a050 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
1a060 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
1a070 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
1a080 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1a090 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1a0a0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
1a0b0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
1a0c0 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
1a0d0 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
1a0e0 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
1a0f0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
1a100 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
1a110 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
1a120 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
1a130 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
1a140 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
1a150 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
1a160 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
1a170 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
1a180 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1a190 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
1a1a0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
1a1b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
1a1c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a1d0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
1a1e0 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
1a1f0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
1a200 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a210 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
1a220 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1a230 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1a240 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1a250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1a260 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
1a270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a280 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1a290 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1a2a0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
1a2b0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1a2c0 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
1a2d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a2e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a2f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a300 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a310 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1a320 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
1a330 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
1a340 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1a350 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
1a360 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
1a370 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
1a380 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
1a390 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1a3a0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
1a3b0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
1a3c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1a3d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1a3e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a3f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1a400 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
1a410 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
1a420 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
1a430 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
1a440 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
1a450 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
1a460 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
1a470 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
1a480 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
1a490 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
1a4a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1a4b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1a4c0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1a4d0 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1a4e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a4f0 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1a500 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1a510 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 43  .#endif.  btreeC
1a520 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1a530 42 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  Bt);.  if( p->in
1a540 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
1a550 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76   && p->db->activ
1a560 65 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20  eVdbeCnt>1 ){.  
1a570 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1a580 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1a590 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1a5a0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1a5b0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1a5c0 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1a5d0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1a5e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1a5f0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1a600 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1a610 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1a620 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1a630 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1a640 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1a650 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1a660 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1a670 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1a680 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1a690 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1a6a0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1a6b0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1a6c0 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1a6d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1a6e0 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1a6f0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1a700 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1a710 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1a720 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1a730 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1a740 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1a750 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1a760 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1a770 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1a780 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1a790 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1a7a0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1a7b0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1a7c0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1a7d0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1a7e0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1a7f0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1a800 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1a810 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1a820 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1a830 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1a840 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1a850 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1a860 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1a870 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1a880 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1a890 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1a8a0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1a8b0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1a8c0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1a8d0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1a8e0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1a8f0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1a900 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1a910 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1a920 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1a930 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1a940 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1a950 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1a960 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1a970 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1a980 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1a990 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1a9a0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1a9b0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1a9c0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1a9d0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1a9e0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1a9f0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1aa00 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1aa10 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1aa20 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1aa30 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1aa40 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1aa50 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1aa60 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1aa70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1aa80 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1aa90 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1aaa0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1aab0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1aac0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1aad0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1aae0 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1aaf0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1ab00 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1ab10 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1ab20 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1ab30 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1ab40 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1ab50 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1ab60 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1ab70 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1ab80 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1ab90 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1aba0 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1abb0 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1abc0 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1abd0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1abe0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1abf0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1ac00 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1ac10 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1ac20 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1ac30 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1ac40 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1ac50 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1ac60 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1ac70 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1ac80 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1ac90 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1aca0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1acb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1acc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1acd0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1ace0 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1acf0 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1ad00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1ad10 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1ad20 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1ad30 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1ad40 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1ad50 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1ad60 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1ad70 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1ad80 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1ad90 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1ada0 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1adb0 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1adc0 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1add0 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1ade0 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1adf0 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1ae00 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1ae10 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1ae20 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1ae30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1ae40 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1ae50 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1ae60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1ae70 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1ae80 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1ae90 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1aea0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1aeb0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1aec0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1aed0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1aee0 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1aef0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1af00 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1af10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1af20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1af30 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1af40 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1af50 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1af60 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1af70 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1af80 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1af90 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1afa0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1afb0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1afc0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1afd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1afe0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1aff0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1b000 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1b010 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1b020 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1b030 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1b040 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1b050 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1b060 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1b070 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1b080 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1b090 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1b0a0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1b0b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1b0c0 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1b0d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b0e0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1b0f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1b100 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1b110 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1b120 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
1b130 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1b140 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b150 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b160 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b170 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1b180 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1b190 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1b1a0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1b1b0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1b1c0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1b1d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1b1e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1b1f0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1b200 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1b210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1b220 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1b230 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1b240 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1b250 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b260 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b270 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1b280 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1b290 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
1b2a0 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
1b2b0 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
1b2c0 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
1b2d0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
1b2e0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
1b2f0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
1b300 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
1b310 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
1b320 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1b330 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1b340 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
1b350 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
1b360 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
1b370 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
1b380 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
1b390 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
1b3a0 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
1b3b0 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
1b3c0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
1b3d0 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
1b3e0 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
1b3f0 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
1b400 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
1b410 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
1b420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1b430 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
1b440 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1b450 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1b460 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
1b470 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
1b480 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
1b490 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
1b4a0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1b4b0 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
1b4c0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
1b4d0 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
1b4e0 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
1b4f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1b500 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1b510 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1b520 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1b530 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1b540 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1b550 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
1b560 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1b570 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1b580 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1b590 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
1b5a0 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
1b5b0 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
1b5c0 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
1b5d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1b5e0 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
1b5f0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
1b600 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
1b610 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
1b620 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1b630 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
1b640 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
1b650 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
1b660 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
1b670 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
1b680 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
1b690 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
1b6a0 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
1b6b0 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
1b6c0 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
1b6d0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
1b6e0 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
1b6f0 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
1b700 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
1b710 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
1b720 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
1b730 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
1b740 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1b750 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1b760 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1b770 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1b780 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1b790 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1b7a0 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
1b7b0 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d  p;.  if( pBtree=
1b7c0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1b7d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b7e0 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
1b7f0 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1b800 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1b810 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1b820 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
1b830 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1b840 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
1b850 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1b860 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74  .    p->skipNext
1b870 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1b880 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1b890 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1b8a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1b8b0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1b8c0 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1b8d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1b8e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b8f0 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
1b900 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
1b910 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
1b920 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
1b930 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
1b940 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
1b950 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
1b960 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1b970 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
1b980 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
1b990 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1b9a0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
1b9b0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
1b9c0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1b9d0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1b9e0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1b9f0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1ba00 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1ba10 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1ba20 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1ba30 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1ba40 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1ba50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ba60 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1ba70 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1ba80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1ba90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1baa0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1bab0 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
1bac0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1bad0 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
1bae0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
1baf0 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
1bb00 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
1bb10 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1bb20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1bb30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1bb40 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
1bb50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
1bb60 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1bb70 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20  (p, tripCode);. 
1bb80 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
1bb90 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
1bba0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1bbb0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
1bbc0 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
1bbd0 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
1bbe0 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
1bbf0 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
1bc00 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1bc10 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
1bc20 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
1bc30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bc40 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
1bc50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1bc60 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
1bc70 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
1bc80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
1bc90 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
1bca0 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
1bcb0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
1bcc0 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
1bcd0 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
1bce0 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
1bcf0 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
1bd00 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
1bd10 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
1bd20 20 30 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f   0, 0)==SQLITE_O
1bd30 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
1bd40 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1bd50 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
1bd60 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65  aData);.      te
1bd70 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30  stcase( nPage==0
1bd80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50   );.      if( nP
1bd90 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  age==0 ) sqlite3
1bda0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1bdb0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
1bdc0 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ge);.      testc
1bdd0 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ase( pBt->nPage!
1bde0 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =nPage );.      
1bdf0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
1be00 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  ge;.      releas
1be10 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
1be20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1be30 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
1be40 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  rs(pBt)==0 );.  
1be50 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1be60 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1be70 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
1be80 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1be90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1bea0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1beb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bec0 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
1bed0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
1bee0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
1bef0 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20  tion can can be 
1bf00 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
1bf10 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
1bf20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
1bf30 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
1bf40 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
1bf50 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
1bf60 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
1bf70 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
1bf80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
1bf90 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
1bfa0 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
1bfb0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
1bfc0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
1bfd0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
1bfe0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
1bff0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
1c000 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
1c010 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
1c020 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
1c030 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
1c040 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
1c050 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
1c060 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
1c070 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1c080 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
1c090 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
1c0a0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
1c0b0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
1c0c0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
1c0d0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
1c0e0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1c0f0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
1c100 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
1c110 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
1c120 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
1c130 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1c140 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
1c150 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1c160 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
1c170 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1c180 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
1c190 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
1c1a0 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
1c1b0 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
1c1c0 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
1c1d0 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
1c1e0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
1c1f0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
1c200 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
1c210 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
1c220 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
1c230 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
1c240 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
1c250 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
1c260 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
1c270 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
1c280 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
1c290 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
1c2a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c2b0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
1c2c0 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
1c2d0 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
1c2e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c2f0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
1c300 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1c310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
1c320 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1c330 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
1c340 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1c350 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1c360 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1c370 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
1c380 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
1c390 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
1c3a0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
1c3b0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1c3c0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1c3d0 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
1c3e0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
1c3f0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1c400 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
1c410 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
1c420 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
1c430 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
1c440 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
1c450 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
1c460 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
1c470 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
1c480 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
1c490 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
1c4a0 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
1c4b0 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
1c4c0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
1c4d0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
1c4e0 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
1c4f0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1c500 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1c510 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1c520 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
1c530 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1c540 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1c550 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
1c560 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1c570 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1c580 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
1c590 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1c5a0 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
1c5b0 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
1c5c0 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
1c5d0 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
1c5e0 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
1c5f0 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
1c600 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
1c610 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
1c620 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
1c630 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
1c640 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1c650 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
1c660 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1c670 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
1c680 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
1c690 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1c6a0 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
1c6b0 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
1c6c0 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
1c6d0 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
1c6e0 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
1c6f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
1c700 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
1c710 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
1c720 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
1c730 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
1c740 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
1c750 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
1c760 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
1c770 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
1c780 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
1c790 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
1c7a0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1c7b0 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
1c7c0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
1c7d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1c7e0 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
1c7f0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1c800 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1c810 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1c820 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
1c830 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
1c840 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
1c850 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
1c860 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
1c870 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
1c880 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
1c890 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1c8a0 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
1c8b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1c8c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c8d0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
1c8e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
1c8f0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
1c900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1c920 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
1c930 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1c940 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
1c950 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
1c960 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1c970 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1c980 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
1c990 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
1c9a0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
1c9b0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
1c9c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1c9d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
1c9e0 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1c9f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1ca00 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
1ca10 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
1ca20 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
1ca30 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
1ca40 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
1ca50 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
1ca60 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
1ca70 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
1ca80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
1ca90 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
1caa0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1cab0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1cac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cad0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1cae0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
1caf0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
1cb00 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
1cb10 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
1cb20 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
1cb30 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1cb40 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1cb50 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
1cb60 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
1cb70 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
1cb80 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
1cb90 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
1cba0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
1cbb0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
1cbc0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1cbd0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
1cbe0 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
1cbf0 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
1cc00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1cc10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
1cc20 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
1cc30 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
1cc40 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
1cc50 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
1cc60 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
1cc70 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
1cc80 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
1cc90 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
1cca0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
1ccb0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
1ccc0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
1ccd0 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
1cce0 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
1ccf0 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
1cd00 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
1cd10 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
1cd20 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
1cd30 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
1cd40 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
1cd50 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
1cd60 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
1cd70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1cd80 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
1cd90 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
1cda0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
1cdb0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
1cdc0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
1cdd0 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
1cde0 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
1cdf0 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
1ce00 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
1ce10 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
1ce20 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
1ce30 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
1ce40 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
1ce50 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
1ce60 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
1ce70 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
1ce80 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
1ce90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1cea0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
1ceb0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
1cec0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
1ced0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
1cee0 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
1cef0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
1cf00 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
1cf10 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
1cf20 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
1cf30 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
1cf40 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
1cf50 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
1cf60 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
1cf70 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
1cf80 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1cf90 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
1cfa0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
1cfb0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
1cfc0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1cfd0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
1cfe0 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
1cff0 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
1d000 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
1d010 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
1d020 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
1d030 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
1d040 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
1d050 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
1d060 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d090 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
1d0a0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0c0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
1d0d0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
1d0e0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1d110 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
1d120 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
1d130 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
1d140 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1d150 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
1d160 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
1d170 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
1d180 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1a0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
1d1b0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
1d1c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d1d0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
1d1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1d1f0 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
1d200 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1d210 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1d220 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
1d230 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1d240 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
1d250 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1d260 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
1d270 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
1d280 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
1d290 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
1d2a0 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
1d2b0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
1d2c0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
1d2d0 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
1d2e0 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
1d2f0 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
1d300 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
1d310 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
1d320 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
1d330 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
1d340 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
1d350 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1d360 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
1d370 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72   pKeyInfo!=0, wr
1d380 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73  Flag+1) );.  ass
1d390 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1d3a0 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
1d3b0 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
1d3c0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
1d3d0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1d3e0 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
1d3f0 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
1d400 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
1d410 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1d420 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
1d430 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1d440 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1d450 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
1d460 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
1d470 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
1d480 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66  ->aData );..  if
1d490 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26  ( NEVER(wrFlag &
1d4a0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
1d4b0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1d4c0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74  )!=0) ){.    ret
1d4d0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
1d4e0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  NLY;.  }.  if( i
1d4f0 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
1d500 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
1d510 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1d520 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
1d530 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
1d540 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
1d550 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
1d560 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
1d570 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
1d580 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
1d590 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
1d5a0 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
1d5b0 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
1d5c0 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
1d5d0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
1d5e0 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
1d5f0 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
1d600 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
1d610 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1d620 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
1d630 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
1d640 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c  Bt;.  pCur->wrFl
1d650 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b  ag = (u8)wrFlag;
1d660 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
1d670 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
1d680 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1d690 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
1d6a0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1d6b0 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
1d6c0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
1d6d0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1d6e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1d6f0 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1d700 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  id = 0;.  return
1d710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
1d720 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1d730 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1d740 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
1d770 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1d780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
1d7b0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
1d7c0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
1d800 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
1d810 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
1d820 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d840 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
1d850 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
1d860 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d880 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1d890 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
1d8a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1d8b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1d8c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1d8d0 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
1d8e0 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
1d8f0 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
1d900 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1d910 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1d920 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1d930 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1d940 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
1d950 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
1d960 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
1d970 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
1d980 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
1d990 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
1d9a0 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
1d9b0 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
1d9c0 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
1d9d0 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
1d9e0 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
1d9f0 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
1da00 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
1da10 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
1da20 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
1da30 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
1da40 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
1da50 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
1da60 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
1da70 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  urn ROUND8(sizeo
1da80 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a  f(BtCursor));.}.
1da90 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1daa0 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69  e memory that wi
1dab0 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
1dac0 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20  into a BtCursor 
1dad0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
1dae0 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63  e simple approac
1daf0 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20  h here would be 
1db00 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20  to memset() the 
1db10 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a  entire object.**
1db20 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69   to zero.  But i
1db30 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74  t turns out that
1db40 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e   the apPage[] an
1db50 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  d aiIdx[] arrays
1db60 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  .** do not need 
1db70 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64  to be zeroed and
1db80 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c   they are large,
1db90 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
1dba0 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d  a lot.** of run-
1dbb0 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67  time by skipping
1dbc0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1dbd0 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65  ion of those ele
1dbe0 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ments..*/.void s
1dbf0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1dc00 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a  rZero(BtCursor *
1dc10 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
1dc20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  0, offsetof(BtCu
1dc30 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d  rsor, iPage));.}
1dc40 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1dc50 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c  cached rowid val
1dc60 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73  ue of every curs
1dc70 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  or in the same d
1dc80 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1dc90 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69  as pCur and havi
1dca0 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ng the same root
1dcb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20   page number as 
1dcc0 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65  pCur.  The value
1dcd0 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52   is.** set to iR
1dce0 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  owid..**.** Only
1dcf0 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20   positive rowid 
1dd00 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
1dd10 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20  dered valid for 
1dd20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54  this cache..** T
1dd30 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74  he cache is init
1dd40 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c  ialized to zero,
1dd50 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
1dd60 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a  nvalid cache..**
1dd70 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f   A btree will wo
1dd80 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72  rk fine with zer
1dd90 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
1dda0 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63  wids.  We just c
1ddb0 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a  annot.** cache z
1ddc0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20  ero or negative 
1ddd0 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65  rowids, which me
1dde0 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20  ans tables that 
1ddf0 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e  use zero or.** n
1de00 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d  egative rowids m
1de10 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
1de20 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69  e slower.  But i
1de30 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f  n practice, zero
1de40 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20  .** or negative 
1de50 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20  rowids are very 
1de60 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73  uncommon so this
1de70 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
1de80 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
1de90 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  d sqlite3BtreeSe
1dea0 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
1deb0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c  ursor *pCur, sql
1dec0 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
1ded0 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  d){.  BtCursor *
1dee0 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d  p;.  for(p=pCur-
1def0 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1df00 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1df10 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
1df20 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ot==pCur->pgnoRo
1df30 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f  ot ) p->cachedRo
1df40 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
1df50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
1df60 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69  ->cachedRowid==i
1df70 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rowid );.}../*.*
1df80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63  * Return the cac
1df90 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68  hed rowid for th
1dfa0 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20  e given cursor. 
1dfb0 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a   A negative or z
1dfc0 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  ero.** return va
1dfd0 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  lue indicates th
1dfe0 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  at the rowid cac
1dff0 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e  he is invalid an
1e000 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  d should be.** i
1e010 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20  gnored.  If the 
1e020 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20  rowid cache has 
1e030 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
1e040 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a  n set, then a.**
1e050 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
1e060 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  d..*/.sqlite3_in
1e070 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  t64 sqlite3Btree
1e080 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42  GetCachedRowid(B
1e090 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1e0a0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63    return pCur->c
1e0b0 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  achedRowid;.}../
1e0c0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
1e0d0 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
1e0e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1e0f0 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
1e100 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
1e110 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
1e120 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
1e130 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
1e140 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
1e150 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
1e160 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
1e170 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
1e180 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
1e190 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
1e1a0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1e1b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1e1c0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1e1d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e1e0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1e1f0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r);.    if( pCur
1e200 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
1e210 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
1e220 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
1e230 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
1e240 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
1e250 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1e260 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
1e270 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
1e280 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
1e290 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50  pPrev = pCur->pP
1e2a0 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  rev;.    }.    f
1e2b0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
1e2c0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1e2d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e2e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
1e2f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
1e300 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1e310 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69  pBt);.    invali
1e320 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1e330 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20  e(pCur);.    /* 
1e340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
1e350 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
1e360 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1e370 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
1e380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e390 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1e3a0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
1e3b0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
1e3c0 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
1e3d0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1e3e0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
1e3f0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1e400 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
1e410 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
1e420 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
1e430 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
1e440 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
1e450 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
1e460 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
1e470 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
1e480 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
1e490 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
1e4a0 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
1e4b0 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a  eParseCell()..**
1e4c0 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20  .** 2007-06-25: 
1e4d0 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20   There is a bug 
1e4e0 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  in some versions
1e4f0 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61   of MSVC that ca
1e500 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  use the.** compi
1e510 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65  ler to crash whe
1e520 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20  n getCellInfo() 
1e530 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1e540 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75  s a macro..** Bu
1e550 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61  t there is a mea
1e560 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61  sureable speed a
1e570 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e  dvantage to usin
1e580 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67  g the macro on g
1e590 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73  cc.** (when less
1e5a0 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
1e5b0 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73  zations like -Os
1e5c0 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64   or -O0 are used
1e5d0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70   and the.** comp
1e5e0 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e  iler is not doin
1e5f0 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69  g agressive inli
1e600 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73  ning.)  So we us
1e610 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
1e620 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e  n.** for MSVC an
1e630 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76  d a macro for ev
1e640 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20  erything else.  
1e650 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f  Ticket #2457..*/
1e660 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1e670 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
1e680 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
1e690 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1e6a0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1e6b0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1e6c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1e6d0 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
1e6e0 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
1e6f0 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
1e700 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1e710 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
1e720 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
1e730 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
1e740 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  ( memcmp(&info, 
1e750 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
1e760 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
1e770 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
1e780 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
1e790 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
1e7a0 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
1e7b0 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
1e7c0 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
1e7d0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
1e7e0 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
1e7f0 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
1e800 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
1e810 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1e820 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1e830 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1e840 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67  {.      int iPag
1e850 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1e860 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
1e870 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1e880 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1e890 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1e8a0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
1e8b0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1e8c0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1e8d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
1e8e0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1e8f0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
1e900 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
1e910 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
1e920 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
1e930 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
1e940 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
1e950 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
1e960 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
1e970 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e9b0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1e9c0 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1ea00 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1ea10 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ea50 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1ea60 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1ea70 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1ea80 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1ea90 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70  ->info); \.    p
1eaa0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1eab0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
1eaf0 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1eb40 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1eb50 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1eb90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
1eba0 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  _VER */..#ifndef
1ebb0 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
1ebc0 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
1ebd0 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1ebe0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1ebf0 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
1ec00 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
1ec10 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
1ec20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
1ec30 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
1ec40 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
1ec50 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
1ec60 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
1ec70 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
1ec80 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
1ec90 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
1eca0 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
1ecb0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1ecc0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
1ecd0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1ece0 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
1ecf0 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1ed00 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
1ed10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ed20 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
1ed30 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
1ed40 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1ed50 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1ed60 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
1ed70 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
1ed80 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
1ed90 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1eda0 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
1edb0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
1edc0 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
1edd0 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
1ede0 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
1edf0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
1ee00 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
1ee10 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
1ee20 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ee30 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
1ee40 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
1ee50 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1ee60 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1ee70 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f  e caller must po
1ee80 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
1ee90 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  r prior to invok
1eea0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1eeb0 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
1eec0 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
1eed0 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  l.  It always re
1eee0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1eef0 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
1ef00 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
1ef10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
1ef20 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  4 *pSize){.  ass
1ef30 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ef40 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ef50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1ef60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1ef70 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
1ef80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ef90 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
1efa0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1efb0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
1efc0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pSize = 0;.  }el
1efd0 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49  se{.    getCellI
1efe0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a  nfo(pCur);.    *
1eff0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1f000 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72  fo.nKey;.  }.  r
1f010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1f030 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1f040 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1f050 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1f060 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1f070 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1f080 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
1f090 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
1f0a0 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
1f0b0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1f0c0 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
1f0d0 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
1f0e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1f0f0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1f100 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
1f110 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
1f120 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
1f130 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
1f140 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
1f150 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1f160 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
1f170 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
1f180 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1f190 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
1f1a0 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
1f1b0 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
1f1c0 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
1f1d0 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
1f1e0 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1f1f0 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
1f200 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
1f210 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
1f220 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1f230 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1f240 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1f250 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1f260 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1f270 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f280 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f290 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
1f2a0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1f2b0 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1f2c0 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65  info.nData;.  re
1f2d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f2e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1f2f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1f300 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
1f310 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1f320 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
1f330 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
1f340 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
1f350 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1f360 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1f370 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
1f380 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
1f390 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
1f3a0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
1f3b0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
1f3c0 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
1f3d0 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
1f3e0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
1f3f0 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
1f400 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
1f410 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1f420 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f430 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1f440 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
1f450 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
1f460 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
1f470 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1f480 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1f490 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
1f4a0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
1f4b0 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
1f4c0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
1f4d0 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
1f4e0 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
1f4f0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
1f500 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
1f510 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
1f520 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1f530 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
1f540 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
1f550 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
1f560 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
1f570 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
1f580 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
1f590 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
1f5a0 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
1f5b0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1f5c0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1f5d0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
1f5e0 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
1f5f0 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
1f600 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
1f610 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
1f620 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
1f630 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
1f640 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
1f650 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
1f660 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
1f670 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
1f680 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
1f690 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1f6a0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1f6b0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1f6c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f6d0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f6e0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1f6f0 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
1f700 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1f710 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1f720 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
1f730 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1f740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1f750 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
1f760 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
1f770 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
1f780 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
1f790 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
1f7a0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
1f7b0 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
1f7c0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
1f7d0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
1f7e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f7f0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1f800 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f810 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1f820 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
1f830 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
1f840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f850 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
1f860 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
1f870 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
1f880 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
1f890 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
1f8a0 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
1f8b0 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
1f8c0 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
1f8d0 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
1f8e0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
1f8f0 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
1f900 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
1f910 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
1f920 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
1f930 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
1f940 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
1f950 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
1f960 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
1f970 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
1f980 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
1f990 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1f9a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1f9b0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
1f9c0 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
1f9d0 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
1f9e0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
1f9f0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1fa00 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
1fa10 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
1fa20 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1fa30 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
1fa40 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
1fa50 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
1fa60 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
1fa70 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1fa80 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
1fa90 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
1faa0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fab0 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
1fac0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1fad0 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
1fae0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
1faf0 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
1fb00 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1fb10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fb20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1fb30 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
1fb40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1fb50 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1fb60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1fb70 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1fb80 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
1fb90 67 65 2c 20 30 2c 20 28 70 70 50 61 67 65 3d 3d  ge, 0, (ppPage==
1fba0 30 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0));.    assert(
1fbb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1fbc0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
1fbd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fbe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
1fbf0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
1fc00 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1fc10 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
1fc20 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
1fc30 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
1fc40 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
1fc50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1fc60 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
1fc70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
1fc80 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1fc90 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
1fca0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
1fcb0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1fcc0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
1fcd0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
1fce0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
1fcf0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
1fd00 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
1fd10 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
1fd20 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
1fd30 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
1fd40 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
1fd50 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
1fd60 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1fd70 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
1fd80 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
1fd90 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
1fda0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
1fdb0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
1fdc0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1fdd0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
1fde0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
1fdf0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
1fe00 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
1fe10 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
1fe20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
1fe30 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1fe40 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1fe50 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
1fe60 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
1fe70 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
1fe80 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
1fe90 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
1fea0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1feb0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
1fec0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1fee0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
1fef0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1ff20 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
1ff30 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
1ff40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
1ff50 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
1ff60 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
1ff70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
1ff80 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
1ff90 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
1ffa0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
1ffb0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
1ffc0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1ffd0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
1ffe0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
1fff0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
20000 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
20010 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
20020 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
20030 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20040 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20050 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
20060 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
20070 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
20080 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
20090 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
200a0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
200b0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
200c0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
200d0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
200e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
200f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20100 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20110 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
20120 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
20130 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
20140 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
20150 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
20160 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
20170 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
20180 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
20190 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
201a0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
201b0 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
201c0 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
201d0 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
201e0 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
201f0 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
20200 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
20210 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
20220 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
20230 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
20240 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
20250 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
20260 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
20270 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
20280 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
20290 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
202a0 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
202b0 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
202c0 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
202d0 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
202e0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
202f0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
20300 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
20310 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
20320 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
20330 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
20340 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
20350 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
20360 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
20370 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
20380 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
20390 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
203a0 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
203b0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
203c0 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
203d0 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
203e0 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
203f0 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
20400 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
20410 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
20420 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
20430 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
20440 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
20450 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
20460 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
20470 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
20480 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
20490 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
204a0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
204b0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
204c0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
204d0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
204e0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
204f0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
20500 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
20510 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
20520 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
20530 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
20540 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
20550 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
20560 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
20570 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
20580 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
20590 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
205a0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
205b0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
205c0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
205d0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
205e0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
205f0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
20600 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
20610 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
20620 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
20630 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
20640 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
20650 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
20660 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
20670 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
20680 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
20690 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
206a0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
206b0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
206c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
206d0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
206e0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
206f0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
20700 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
20710 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
20720 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
20730 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
20740 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
20750 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
20760 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
20770 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
20780 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
20790 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
207a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
207b0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
207c0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
207d0 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
207e0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
207f0 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
20800 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
20810 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
20820 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
20830 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
20840 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20850 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20860 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
20870 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20880 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
20890 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
208a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
208b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
208c0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
208d0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
208e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
208f0 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
20900 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
20910 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
20920 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
20930 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
20940 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b  f( NEVER(offset+
20950 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
20960 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20  >info.nData) .  
20970 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43   || &aPayload[pC
20980 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
20990 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
209a0 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
209b0 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ].  ){.    /* Tr
209c0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
209d0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
209e0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
209f0 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
20a00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20a20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
20a30 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
20a40 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
20a50 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
20a60 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
20a70 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
20a80 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
20a90 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
20aa0 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
20ab0 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
20ac0 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
20ad0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20ae0 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
20af0 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
20b00 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
20b10 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
20b20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
20b30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
20b40 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
20b50 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
20b60 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
20b70 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
20b80 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
20b90 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
20ba0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
20bb0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
20bc0 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
20bd0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
20be0 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
20bf0 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
20c00 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
20c10 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
20c20 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
20c30 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
20c40 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
20c50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20c60 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
20c70 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
20c80 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
20c90 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
20ca0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
20cb0 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
20cc0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
20cd0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
20ce0 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
20cf0 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
20d00 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
20d10 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
20d20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
20d30 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
20d40 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
20d50 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
20d60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
20d70 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
20d80 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
20d90 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
20da0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
20db0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
20dc0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
20dd0 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
20de0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
20df0 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
20e00 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
20e10 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
20e20 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
20e30 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
20e40 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
20e50 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
20e60 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
20e70 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
20e80 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
20e90 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
20ea0 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
20eb0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
20ec0 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
20ed0 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c    /* nOvfl is al
20ee0 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20  ways positive.  
20ef0 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c  If it were zero,
20f00 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f   fetchPayload wo
20f10 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a  uld have.      *
20f20 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74  * been used inst
20f30 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ead of this rout
20f40 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ine. */.      if
20f50 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20  ( ALWAYS(nOvfl) 
20f60 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
20f70 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
20f80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
20f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20fa0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
20fb0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
20fc0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
20fd0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
20fe0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
20ff0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
21000 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
21010 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
21020 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
21030 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
21040 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
21050 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
21060 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
21070 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
21080 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
21090 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
210a0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
210b0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
210c0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
210d0 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
210e0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
210f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
21100 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
21110 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
21120 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
21130 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21140 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
21150 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
21160 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
21170 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
21180 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
21190 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
211a0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
211b0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
211c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
211d0 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
211e0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
211f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
21200 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
21210 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
21220 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21230 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
21240 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
21250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
21260 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
21270 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
21280 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
21290 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
212a0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
212b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
212c0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
212d0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
212e0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
212f0 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
21300 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
21310 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
21320 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
21330 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
21340 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
21350 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
21360 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
21370 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
21380 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
21390 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
213a0 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
213b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
213c0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
213d0 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
213e0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
213f0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
21400 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
21410 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
21420 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
21430 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
21440 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
21450 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
21460 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
21470 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
21480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21490 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
214a0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
214b0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
214c0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
214d0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
214e0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
214f0 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
21500 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
21510 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
21520 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21530 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
21540 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
21550 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23  ite3_file *fd;.#
21560 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
21570 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
21580 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
21590 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
215a0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
215b0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
215c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
215d0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
215e0 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
215f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
21600 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
21610 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
21620 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
21630 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
21640 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
21650 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
21660 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
21670 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
21680 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
21690 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
216a0 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
216b0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
216c0 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
216d0 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
216e0 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
216f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
21700 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  n, and.        *
21710 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62  *   5) the datab
21720 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c  ase is not a WAL
21730 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20   database,.     
21740 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
21750 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62   then data can b
21760 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20  e read directly 
21770 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21780 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a  e file into the.
21790 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
217a0 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73  t buffer, bypass
217b0 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63  ing the page-cac
217c0 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54  he altogether. T
217d0 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20  his speeds.     
217e0 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67     ** up loading
217f0 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74   large records t
21800 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76  hat span many ov
21810 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
21820 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21830 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20   if( eOp==0     
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21860 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
21870 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66  /.         && of
21880 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20  fset==0         
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
218c0 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
218d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
218e0 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
218f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
21900 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
21910 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
21920 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
21930 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
21940 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
21950 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
21960 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
21970 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
21980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
21990 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  5) */.        ){
219a0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
219b0 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
219c0 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
219d0 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
219e0 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
219f0 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
21a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21a10 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
21a20 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
21a30 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
21a40 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
21a50 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
21a60 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
21a70 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
21a80 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
21a90 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
21aa0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
21ab0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
21ac0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
21ad0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
21ae0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
21af0 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
21b00 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
21b10 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
21b20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20        (eOp==0 ? 
21b30 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f 52 45  PAGER_ACQUIRE_RE
21b40 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20  ADONLY : 0).    
21b50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
21b60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21b80 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
21b90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
21ba0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
21bb0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
21bc0 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
21bd0 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
21be0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
21bf0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
21c00 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
21c10 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
21c20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21c30 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
21c40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21c50 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
21c60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21c80 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
21c90 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
21ca0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
21cb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21cc0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
21cd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21ce0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21cf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
21d10 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
21d20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
21d30 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
21d40 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
21d50 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
21d60 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
21d70 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
21d80 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
21d90 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54  offset"..**.** T
21da0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
21db0 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20  nsure that pCur 
21dc0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
21dd0 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e   valid row.** in
21de0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
21df0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
21e00 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
21e10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
21e20 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
21e30 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
21e40 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
21e50 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
21e60 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
21e70 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
21e80 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
21e90 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
21ea0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21eb0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
21ec0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
21ed0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
21ee0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21ef0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21f00 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21f10 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21f20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
21f30 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
21f40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21f50 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
21f60 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21f70 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
21f80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21f90 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
21fa0 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
21fb0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
21fc0 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
21fd0 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29  d char*)pBuf, 0)
21fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
21ff0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
22000 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22010 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
22020 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
22030 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
22040 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
22050 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
22060 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
22070 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
22080 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
22090 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
220a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
220b0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
220c0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
220d0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
220e0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
220f0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
22100 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
22110 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
22120 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
22130 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
22140 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
22150 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
22160 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
22170 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22180 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
22190 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
221a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
221b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
221c0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
221d0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
221e0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
221f0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
22200 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
22210 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
22220 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22230 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
22240 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22250 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
22260 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22270 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
22280 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22290 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73  iPage] );.    as
222a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
222b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
222c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
222d0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
222e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
222f0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
22300 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
22310 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
22320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22330 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22340 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
22350 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
22360 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
22370 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
22380 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
22390 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
223a0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
223b0 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
223c0 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e  if skipKey==0 an
223d0 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  d it points to t
223e0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
223f0 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b  data if.** skipK
22400 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62  ey==1.  The numb
22410 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
22420 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74  vailable key/dat
22430 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  a is written.** 
22440 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
22450 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
22460 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
22470 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a  d will not be.**
22480 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
22490 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
224a0 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
224b0 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
224c0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
224d0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
224e0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
224f0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
22500 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
22510 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
22520 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
22530 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
22540 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
22550 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
22560 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
22570 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
22580 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
22590 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
225a0 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
225b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
225c0 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
225d0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
225e0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
225f0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
22600 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
22610 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
22620 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
22630 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
22640 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
22650 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
22660 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
22670 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
22680 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
22690 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
226a0 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
226b0 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
226c0 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
226d0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
226e0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
226f0 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c   char *fetchPayl
22700 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
22710 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
22720 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
22730 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
22740 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
22750 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Amt,           /
22760 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
22770 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
22780 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  bytes here */.  
22790 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20  int skipKey     
227a0 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67       /* read beg
227b0 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69  inning at data i
227c0 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
227d0 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
227e0 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
227f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
22800 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
22810 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61  u32 nLocal;..  a
22820 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
22830 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
22840 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
22850 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
22860 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22870 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22880 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  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 70 50  ex(pCur) );.  pP
228b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
228c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
228d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
228e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
228f0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
22900 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
22910 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
22920 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65  ==0) ){.    btre
22930 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
22940 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22950 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
22960 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a  x[pCur->iPage],.
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b     &pCur->info);
22990 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20  .  }.  aPayload 
229a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
229b0 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
229c0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
229d0 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
229e0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
229f0 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
22a00 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28  se{.    nKey = (
22a10 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
22a20 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
22a30 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
22a40 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
22a50 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
22a60 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
22a70 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
22a80 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
22a90 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
22aa0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63      assert( nLoc
22ab0 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a  al<=nKey );.  }.
22ac0 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
22ad0 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
22ae0 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
22af0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
22b00 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
22b10 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
22b20 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
22b30 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
22b40 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
22b50 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
22b60 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
22b70 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
22b80 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
22b90 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
22ba0 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
22bb0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
22bc0 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
22bd0 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
22be0 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
22bf0 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
22c00 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
22c10 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
22c20 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
22c30 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
22c40 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
22c50 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
22c60 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
22c70 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
22c80 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
22c90 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
22ca0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
22cb0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
22cc0 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
22cd0 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
22ce0 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
22cf0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
22d00 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
22d10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
22d20 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
22d30 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
22d40 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
22d50 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
22d60 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74   *pAmt){.  const
22d70 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20   void *p = 0;.  
22d80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22d90 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
22da0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
22db0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
22dc0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22dd0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
22de0 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53   ALWAYS(pCur->eS
22df0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22e00 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  ID) ){.    p = (
22e10 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
22e20 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
22e30 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 0);.  }.  r
22e40 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74  eturn p;.}.const
22e50 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
22e60 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
22e70 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
22e80 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74   *pAmt){.  const
22e90 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20   void *p = 0;.  
22ea0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22eb0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
22ec0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
22ed0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
22ee0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22ef0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
22f00 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53   ALWAYS(pCur->eS
22f10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22f20 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  ID) ){.    p = (
22f30 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
22f40 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
22f50 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
22f60 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn p;.}.../*.
22f70 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
22f80 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
22f90 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
22fa0 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
22fb0 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
22fc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
22fd0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
22fe0 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
22ff0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
23000 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
23010 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
23020 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
23030 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
23040 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
23050 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
23060 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
23070 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
23080 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
23090 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
230a0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
230b0 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
230c0 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
230d0 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
230e0 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
230f0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
23100 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
23110 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
23120 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
23130 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
23140 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
23150 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
23160 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
23170 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
23180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23190 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
231a0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
231b0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
231c0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
231d0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
231e0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
231f0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
23200 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
23210 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
23220 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23230 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23240 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
23250 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
23260 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
23270 67 65 2c 20 28 70 43 75 72 2d 3e 77 72 46 6c 61  ge, (pCur->wrFla
23280 67 3d 3d 30 29 29 3b 0a 20 20 69 66 28 20 72 63  g==0));.  if( rc
23290 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
232a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
232b0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
232c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
232d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
232e0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
232f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
23300 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
23310 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
23320 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  wPage->nCell<1 |
23330 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b  | pNewPage->intK
23340 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ey!=pCur->apPage
23350 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [i]->intKey ){. 
23360 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23370 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
23380 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
23390 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a  TE_OK;.}..#if 0.
233a0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
233b0 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
233c0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
233d0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
233e0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
233f0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
23400 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
23410 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
23420 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
23430 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
23440 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
23450 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
23460 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
23470 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
23480 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
23490 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
234a0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
234b0 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
234c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
234d0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
234e0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
234f0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
23500 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73  o iChild){.  ass
23510 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
23520 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
23530 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
23540 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
23550 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
23560 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
23570 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
23580 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
23590 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
235a0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
235b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
235c0 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
235d0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
235e0 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
235f0 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
23600 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
23610 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23620 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
23630 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
23640 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
23650 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
23660 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
23670 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
23680 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
23690 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
236a0 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
236b0 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
236c0 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
236d0 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
236e0 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
236f0 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
23700 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
23710 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
23720 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
23730 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23740 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
23750 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23760 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23770 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23780 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23790 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
237a0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
237b0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
237c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
237d0 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74  .  /* UPDATE: It
237e0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
237f0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f  sible for the co
23800 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62  ndition tested b
23810 79 20 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a  y the assert.  *
23820 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e  * below to be un
23830 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
23840 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
23850 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f  rupt. This can o
23860 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65  ccur if.  ** one
23870 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69   cursor has modi
23880 66 69 65 64 20 70 61 67 65 20 70 50 61 72 65 6e  fied page pParen
23890 74 20 77 68 69 6c 65 20 61 20 72 65 66 65 72 65  t while a refere
238a0 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c  nce to it is hel
238b0 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63  d .  ** by a sec
238c0 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63  ond cursor. Whic
238d0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
238e0 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  n if a single pa
238f0 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a  ge is linked.  *
23900 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  * into more than
23910 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
23920 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75  cture in a corru
23930 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  pt database.  */
23940 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 50  .#if 0.  assertP
23950 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
23960 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23970 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
23980 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
23990 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
239a0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
239b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
239c0 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20  no.  );.#endif. 
239d0 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
239e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
239f0 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
23a00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23a10 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  -1]->nCell );.. 
23a20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
23a30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23a40 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
23a50 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
23a60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
23a70 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
23a80 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
23a90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23aa0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
23ab0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
23ac0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
23ad0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
23ae0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
23af0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
23b00 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
23b10 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
23b20 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
23b30 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
23b40 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
23b50 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
23b60 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
23b70 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
23b80 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
23b90 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
23ba0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
23bb0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
23bc0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
23bd0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
23be0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
23bf0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
23c00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
23c10 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
23c20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
23c30 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
23c40 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
23c50 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
23c60 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
23c70 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
23c80 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
23c90 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
23ca0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
23cb0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
23cc0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
23cd0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
23ce0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
23cf0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
23d00 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
23d10 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
23d20 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
23d30 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
23d40 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
23d50 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
23d60 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
23d70 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
23d80 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
23d90 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
23da0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
23db0 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
23dc0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
23dd0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
23de0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
23df0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
23e00 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
23e10 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
23e20 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
23e30 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
23e40 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
23e50 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
23e60 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
23e70 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
23e80 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
23e90 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
23ea0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
23eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
23ec0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
23ed0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
23ee0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
23ef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23f00 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
23f10 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
23f20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23f30 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
23f40 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23f50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23f60 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
23f70 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
23f80 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
23f90 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
23fa0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
23fb0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
23fc0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
23fd0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
23fe0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
23ff0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
24000 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
24010 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
24020 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24030 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
24040 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
24050 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
24060 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
24070 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
24080 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
24090 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
240a0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
240b0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
240c0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
240d0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
240e0 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  1; i<=pCur->iPag
240f0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
24100 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
24110 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
24120 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
24130 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ge = 0;.  }else 
24140 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
24150 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
24160 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
24170 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
24180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24190 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
241a0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
241b0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
241c0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
241d0 70 50 61 67 65 5b 30 5d 2c 20 70 43 75 72 2d 3e  pPage[0], pCur->
241e0 77 72 46 6c 61 67 3d 3d 30 29 3b 0a 20 20 20 20  wrFlag==0);.    
241f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24200 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
24210 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24220 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
24230 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
24240 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
24250 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 0;..    /* If
24260 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
24270 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
24280 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
24290 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
242a0 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65  rsor.    ** expe
242b0 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
242c0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
242d0 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
242e0 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
242f0 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
24300 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
24310 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
24320 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
24330 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65   case,.    ** re
24340 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
24350 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a  ORRUPT error.  *
24360 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  /.    assert( pC
24370 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
24380 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72  ntKey==1 || pCur
24390 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
243a0 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Key==0 );.    if
243b0 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ( (pCur->pKeyInf
243c0 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50  o==0)!=pCur->apP
243d0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
243e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
243f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24400 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
24410 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
24420 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
24430 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
24440 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20  type. This must 
24450 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65  be the.  ** case
24460 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   as the call to 
24470 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68  this function th
24480 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f  at loaded the ro
24490 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a  ot-page (either.
244a0 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f    ** this call o
244b0 72 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76  r a previous inv
244c0 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68  ocation) would h
244d0 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
244e0 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66  ruption .  ** if
244f0 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20   the assumption 
24500 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
24510 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  nd it is not pos
24520 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c  sible for the fl
24530 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74  ags .  ** byte t
24540 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  o have been modi
24550 66 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20  fied while this 
24560 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e  cursor is holdin
24570 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  g a reference.  
24580 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20  ** to the page. 
24590 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   */.  pRoot = pC
245a0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
245b0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
245c0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
245d0 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Root );.  assert
245e0 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20  ( pRoot->isInit 
245f0 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  && (pCur->pKeyIn
24600 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69  fo==0)==pRoot->i
24610 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72  ntKey );..  pCur
24620 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
24630 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
24640 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
24650 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
24660 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
24670 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0;..  if( pRoot-
24680 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
24690 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
246a0 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
246b0 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
246c0 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
246d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
246e0 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
246f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
24700 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
24710 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
24720 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
24730 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
24740 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
24750 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
24760 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
24770 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24780 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e   ((pRoot->nCell>
24790 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
247a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
247b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
247c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
247d0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
247e0 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
247f0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
24800 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
24810 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
24820 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
24830 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
24840 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
24850 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
24860 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
24870 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
24880 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
24890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
248a0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
248b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
248c0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
248d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
248e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
248f0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
24900 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24910 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24920 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
24930 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
24940 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
24950 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
24960 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24970 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
24980 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
24990 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
249a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
249b0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
249c0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
249d0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
249e0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
249f0 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
24a00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
24a10 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
24a20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
24a40 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
24a50 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
24a60 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
24a70 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
24a80 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
24a90 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24aa0 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
24ab0 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
24ac0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
24ad0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
24ae0 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
24af0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
24b00 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
24b10 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
24b20 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
24b30 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
24b40 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
24b50 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
24b60 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
24b70 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
24b80 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
24b90 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
24ba0 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
24bb0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
24bc0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
24bd0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
24be0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
24bf0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
24c00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
24c10 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
24c20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24c30 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
24c40 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
24c50 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24c60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24c70 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24c80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24c90 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
24ca0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
24cb0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24cc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
24cd0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
24ce0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
24cf0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
24d00 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
24d10 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
24d20 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
24d30 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
24d40 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
24d50 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
24d60 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
24d70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24d80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24d90 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
24da0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70  ->nCell-1;.    p
24db0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
24dc0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
24dd0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
24de0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24df0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
24e00 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
24e10 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
24e20 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
24e30 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
24e40 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
24e50 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
24e60 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
24e70 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
24e80 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
24e90 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
24ea0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
24eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24ec0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
24ed0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
24ee0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
24ef0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24f00 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
24f10 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24f20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
24f30 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
24f40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
24f50 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
24f60 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
24f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
24f80 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
24f90 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
24fa0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
24fb0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
24fc0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
24fd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
24fe0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
24ff0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
25000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
25010 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
25020 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25030 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
25040 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
25050 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
25060 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
25070 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
25090 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
250a0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
250b0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
250c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
250d0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
250e0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
250f0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
25100 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
25110 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
25120 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
25130 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
25140 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
25150 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
25160 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
25170 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
25180 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
25190 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
251a0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
251b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
251c0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
251d0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
251e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
251f0 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
25200 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
25210 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
25220 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
25230 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
25240 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70  Cur->eState && p
25250 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23  Cur->atLast ){.#
25260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
25270 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
25280 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
25290 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
252a0 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
252b0 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
252c0 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
252d0 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
252e0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
252f0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
25300 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
25310 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
25320 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
25330 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
25340 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
25350 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
25360 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
25370 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
25380 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25390 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
253a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
253b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
253c0 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
253d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
253e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
253f0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
25400 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
25410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25420 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
25430 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
25440 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
25450 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25460 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
25470 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25480 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
25490 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
254a0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
254b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
254c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
254d0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
254e0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
254f0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
25500 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
25510 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c  .      pCur->atL
25520 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  ast = rc==SQLITE
25530 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a  _OK ?1:0;.    }.
25540 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25550 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
25560 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
25570 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
25580 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
25590 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
255a0 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
255b0 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
255c0 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
255d0 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
255e0 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
255f0 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
25600 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
25610 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
25620 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
25630 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
25640 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
25650 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
25660 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
25670 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
25680 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
25690 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
256a0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
256b0 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
256c0 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
256d0 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
256e0 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
256f0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
25700 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
25710 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
25720 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
25730 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
25740 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
25750 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
25760 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
25770 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
25780 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
25790 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
257a0 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
257b0 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
257c0 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
257d0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
257e0 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
257f0 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
25800 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
25810 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
25820 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
25830 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
25840 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
25850 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
25860 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
25870 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
25880 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
25890 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
258a0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
258b0 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
258c0 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
258d0 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
258e0 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
258f0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
25900 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
25910 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
25940 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
25950 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
25960 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
25970 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
25980 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25990 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
259a0 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
259b0 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
259c0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
259d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
259e0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
259f0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
25a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25a10 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
25a20 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
25a30 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
25a40 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
25a50 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
25a60 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
25a70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
25a80 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
25a90 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
25aa0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
25ab0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
25ac0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
25ad0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25af0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
25b00 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
25b10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
25b20 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
25b30 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25b40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25b50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
25b60 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
25b70 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
25b80 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
25b90 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
25ba0 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
25bb0 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
25bc0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
25bd0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
25be0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
25bf0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
25c00 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
25c10 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
25c20 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
25c30 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
25c40 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25c50 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
25c60 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
25c70 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
25c80 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
25c90 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
25ca0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
25cb0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
25cc0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
25cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25ce0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
25cf0 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
25d00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
25d10 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
25d20 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
25d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25d40 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
25d50 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
25d60 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
25d70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
25d80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
25d90 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
25da0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
25db0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
25dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25dd0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
25de0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25df0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
25e00 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
25e10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25e20 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
25e30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25e40 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25e50 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
25e60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25e70 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
25e80 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
25e90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
25ea0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
25eb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25ec0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
25ed0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
25ee0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
25ef0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
25f00 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
25f10 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
25f20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
25f30 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a   lwr, upr, idx;.
25f40 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
25f50 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
25f60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
25f70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
25f80 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20  .    int c;..   
25f90 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
25fa0 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
25fb0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
25fc0 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
25fd0 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
25fe0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
25ff0 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
26000 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
26010 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
26020 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
26030 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
26040 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
26050 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
26060 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
26070 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
26080 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
26090 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
260a0 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
260b0 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
260c0 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
260d0 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
260e0 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
260f0 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
26100 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
26110 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
26120 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
26130 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
26140 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26150 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
26160 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
26170 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
26180 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
26190 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
261a0 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
261b0 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73  -1;.    if( bias
261c0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
261d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
261e0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
261f0 69 64 78 20 3d 20 75 70 72 29 3b 0a 20 20 20 20  idx = upr);.    
26200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
26210 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26220 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64  Page] = (u16)(id
26230 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 29  x = (upr+lwr)/2)
26240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
26250 3b 3b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ;;){.      u8 *p
26260 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26280 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
26290 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
262a0 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ge */..      ass
262b0 65 72 74 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e  ert( idx==pCur->
262c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
262d0 65 5d 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  e] );.      pCur
262e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
262f0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
26300 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
26310 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
26320 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
26330 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
26340 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
26350 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
26360 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
26370 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
26380 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
26390 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
263a0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
263b0 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  Cell, dummy);.  
263c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
263d0 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
263e0 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
263f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
26400 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
26410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
26420 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
26430 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69  e if( nCellKey<i
26440 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
26450 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20     c = -1;.     
26460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26470 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
26480 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  lKey>intKey );. 
26490 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
264a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
264b0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
264c0 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ey = 1;.        
264d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
264e0 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
264f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26500 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
26510 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
26520 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
26530 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
26540 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
26550 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
26560 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
26570 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
26580 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
26590 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
265a0 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
265b0 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
265c0 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
265d0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
265e0 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
265f0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
26600 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
26610 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
26620 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
26630 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
26640 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
26650 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
26660 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
26670 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
26680 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
26690 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
266a0 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
266b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
266c0 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
266d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
266e0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20      int nCell = 
266f0 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
26700 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
26710 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
26720 6f 61 64 0a 20 20 20 20 20 20 20 20 20 2f 2a 20  oad.         /* 
26730 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 29  && (pCell+nCell)
26740 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  <pPage->aDataEnd
26750 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
26760 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
26770 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
26780 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
26790 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
267a0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
267b0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
267c0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
267d0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
267e0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
267f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
26800 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
26810 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26820 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
26830 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
26840 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
26850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
26860 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
26870 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
26880 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
26890 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
268a0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
268b0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
268c0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
268d0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
268e0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
268f0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
26900 20 20 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c 2b     /* && (pCell+
26910 6e 43 65 6c 6c 2b 32 29 3c 3d 70 50 61 67 65 2d  nCell+2)<=pPage-
26920 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20 20 20  >aDataEnd */.   
26930 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26940 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
26950 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
26960 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
26970 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
26980 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
26990 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
269a0 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
269b0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
269c0 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
269d0 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
269e0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
269f0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
26a00 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
26a10 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
26a20 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
26a30 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
26a40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
26a50 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
26a60 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
26a70 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
26a80 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
26a90 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
26aa0 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
26ab0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
26ac0 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
26ad0 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
26ae0 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
26af0 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
26b00 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
26b10 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
26b20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
26b30 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
26b40 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
26b50 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
26b60 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
26b70 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
26b80 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
26b90 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
26ba0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
26bb0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
26bc0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
26bd0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
26be0 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
26bf0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
26c00 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
26c10 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
26c20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
26c30 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
26c40 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
26c50 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
26c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26c70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
26c80 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
26c90 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
26ca0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
26cb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26cc0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
26cd0 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
26ce0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
26cf0 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
26d00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
26d10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26d20 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
26d30 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
26d40 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
26d50 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
26d60 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
26d70 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
26d80 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
26d90 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
26da0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
26db0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
26dc0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
26dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26de0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
26df0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
26e00 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
26e10 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
26e20 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
26e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26e50 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
26e60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26e70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
26e80 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
26e90 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
26ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26eb0 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
26ec0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
26ed0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26ee0 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
26ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26f00 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20  f( lwr>upr ){.  
26f10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26f20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
26f30 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
26f40 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20  ge] = (u16)(idx 
26f50 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a  = (lwr+upr)/2);.
26f60 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
26f70 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
26f80 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
26f90 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
26fa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
26fb0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
26fc0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
26fd0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
26fe0 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
26ff0 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
27000 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
27010 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
27020 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
27030 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
27040 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
27050 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
27060 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
27070 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
27080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27090 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
270a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
270b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
270c0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
270d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
270e0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70  Cell );.      *p
270f0 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
27100 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27110 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
27120 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
27130 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
27140 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
27150 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72  16)lwr;.    pCur
27160 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
27170 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
27180 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72  dNKey = 0;.    r
27190 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
271a0 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
271b0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
271c0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
271d0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
271e0 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  h:.  return rc;.
271f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
27200 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
27210 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
27220 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
27230 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
27240 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
27250 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
27260 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
27270 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
27280 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
27290 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
272a0 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
272b0 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
272c0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
272d0 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
272e0 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
272f0 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
27300 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
27310 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
27320 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
27330 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
27340 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
27350 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
27360 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
27370 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
27380 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
27390 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
273a0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
273b0 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
273c0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
273d0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
273e0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
273f0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
27400 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
27410 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
27420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
27430 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
27440 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
27450 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
27460 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
27470 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
27480 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
27490 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
274a0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
274b0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
274c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
274d0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
274e0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
274f0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
27500 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
27510 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
27520 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
27530 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
27540 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
27550 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
27560 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27570 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27580 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
27590 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
275a0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
275b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
275c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
275d0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
275e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53  =0 );.  if( CURS
275f0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
27600 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
27610 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
27620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27630 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
27640 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
27650 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
27660 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
27670 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
27680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
27690 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
276a0 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
276b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
276c0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
276d0 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
276e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
276f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
27700 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a  >isInit );..  /*
27710 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
27720 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
27730 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
27740 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
27750 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
27760 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
27770 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
27780 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
27790 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
277a0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
277b0 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
277c0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
277d0 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
277e0 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
277f0 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
27800 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
27810 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
27820 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
27830 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
27840 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
27850 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
27860 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
27870 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
27880 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
27890 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
278a0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
278b0 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
278c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
278d0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
278e0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
278f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
27900 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
27910 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
27920 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
27930 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
27940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
27950 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
27960 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
27970 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27980 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
27990 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
279a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
279b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
279c0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
279d0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
279e0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
279f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
27a00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27a10 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
27a20 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
27a30 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
27a40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27a50 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
27a60 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
27a70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
27a80 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
27a90 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
27aa0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
27ab0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
27ac0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
27ad0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
27ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
27af0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27b00 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
27b10 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
27b20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
27b30 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
27b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27b50 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
27b60 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
27b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27b80 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
27b90 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
27ba0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
27bb0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
27bc0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
27bd0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
27be0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
27bf0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
27c00 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
27c10 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
27c20 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27c30 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
27c40 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
27c50 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
27c60 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
27c70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27c80 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
27c90 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
27ca0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
27cb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27cc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
27cd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
27ce0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
27cf0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
27d00 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
27d10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27d20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
27d30 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
27d40 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
27d50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
27d60 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
27d70 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
27d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d90 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
27da0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
27db0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
27dc0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
27dd0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
27de0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27df0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
27e00 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
27e10 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
27e20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
27e30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27e40 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
27e50 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
27e60 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
27e70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27e80 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
27e90 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
27ea0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
27eb0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
27ec0 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
27ed0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
27ee0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
27ef0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
27f00 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
27f10 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
27f20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27f30 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
27f40 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
27f50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
27f60 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
27f70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
27f80 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
27f90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
27fa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27fb0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
27fc0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
27fd0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
27fe0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
27ff0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
28000 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
28010 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28020 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
28030 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
28040 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28050 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
28060 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
28070 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
28080 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
28090 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
280a0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
280b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
280c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
280d0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
280e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
280f0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
28100 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
28110 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
28120 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
28130 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
28140 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
28150 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
28160 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
28170 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
28180 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
28190 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
281a0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
281b0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
281c0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
281d0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
281e0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
281f0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
28200 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
28210 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
28220 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
28230 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
28240 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
28250 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
28260 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
28270 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
28280 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
28290 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
282a0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
282b0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
282c0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
282d0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
282e0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
282f0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
28300 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
28310 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
28320 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
28330 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
28340 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
28350 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
28360 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
28370 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
28380 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
28390 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
283a0 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
283b0 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
283c0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
283d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
283e0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
283f0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
28400 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
28410 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
28420 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
28430 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
28440 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
28450 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
28460 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
28470 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
28480 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
28490 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
284a0 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
284b0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
284c0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
284d0 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
284e0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
284f0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
28500 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
28510 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
28520 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
28530 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
28540 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
28550 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
28560 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
28570 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
28580 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
28590 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
285a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
285b0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
285c0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
285d0 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
285e0 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
285f0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
28600 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
28610 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
28620 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
28630 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
28640 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
28650 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
28660 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
28670 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
28680 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
28690 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
286a0 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
286b0 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
286c0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
286d0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
286e0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
286f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
28700 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
28710 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
28720 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
28730 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
28740 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
28750 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
28760 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
28770 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
28780 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
28790 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
287a0 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
287b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
287c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
287d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
287e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
287f0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
28800 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
28810 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
28820 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
28830 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
28840 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
28850 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
28860 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
28870 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  t);.  n = get4by
28880 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
28890 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
288a0 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
288b0 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
288c0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
288d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
288e0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
288f0 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
28900 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
28910 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
28920 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
28930 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
28940 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
28950 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
28960 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
28970 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
28980 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
28990 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
289a0 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
289b0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
289c0 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
289d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
289e0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
289f0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
28a00 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
28a10 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
28a20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
28a30 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
28a40 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
28a50 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
28a60 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
28a70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28a80 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
28a90 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
28aa0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
28ab0 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
28ac0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
28ad0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28ae0 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
28af0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
28b00 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
28b10 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
28b20 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
28b30 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
28b40 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
28b50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28b60 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
28b70 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
28b80 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
28b90 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
28ba0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28bb0 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
28bc0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
28bd0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
28be0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
28bf0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
28c00 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
28c10 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
28c20 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
28c30 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
28c40 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
28c50 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
28c60 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
28c70 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
28c80 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
28c90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
28ca0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
28cb0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
28cc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
28cd0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
28ce0 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
28cf0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
28d00 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
28d10 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
28d20 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
28d30 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
28d40 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
28d50 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
28d60 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
28d70 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
28d80 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
28d90 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
28da0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
28db0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
28dc0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
28dd0 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
28de0 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
28df0 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
28e00 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
28e10 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
28e20 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
28e30 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
28e40 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
28e50 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
28e60 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
28e70 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
28e80 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
28e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28ea0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
28eb0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
28ec0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
28ed0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
28ee0 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
28ef0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
28f00 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a  Trunk>mxPage ){.
28f10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28f20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28f30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28f40 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
28f50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
28f60 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
28f70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
28f80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
28f90 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
28fa0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
28fb0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
28fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28fd0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d  assert( pTrunk!=
28fe0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
28ff0 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  t( pTrunk->aData
29000 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20  !=0 );..      k 
29010 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
29020 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f  nk->aData[4]); /
29030 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  * # of leaves on
29040 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
29050 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   */.      if( k=
29060 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
29070 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
29080 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
29090 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
290a0 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
290b0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
290c0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
290d0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
290e0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
290f0 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
29100 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
29110 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
29120 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29130 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
29140 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29150 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29160 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
29170 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
29180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
29190 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
291a0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
291b0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
291c0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
291d0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
291e0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
291f0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
29200 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
29210 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
29220 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
29230 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
29240 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
29250 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
29260 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
29270 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
29280 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
29290 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
292a0 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
292b0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
292c0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
292d0 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
292e0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
292f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29300 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29310 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29320 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
29330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29340 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
29350 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
29360 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
29370 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
29380 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
29390 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
293a0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
293b0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
293c0 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
293d0 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
293e0 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
293f0 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
29400 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
29410 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
29420 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
29430 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
29440 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29450 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
29460 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
29470 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
29480 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
29490 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
294a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
294b0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
294c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
294d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
294e0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
294f0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
29500 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
29510 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
29520 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
29530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29540 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
29550 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
29560 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
29570 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
29580 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
29590 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
295a0 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
295b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
295c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
295d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
295e0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
295f0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
29600 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
29610 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
29620 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
29630 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
29640 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
29650 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29670 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
29680 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
29690 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
296a0 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
296b0 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
296c0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
296d0 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
296e0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
296f0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
29700 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
29710 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
29720 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29730 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
29740 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
29750 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
29760 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
29770 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
29780 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
29790 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
297a0 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
297b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
297c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
297d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
297e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
297f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29800 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
29810 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
29820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
29830 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
29840 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
29850 70 4e 65 77 54 72 75 6e 6b 2c 20 30 2c 20 30 29  pNewTrunk, 0, 0)
29860 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29880 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29890 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
298a0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
298b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
298c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
298d0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
298e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
298f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29900 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29910 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
29920 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
29930 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29940 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
29950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29960 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
29970 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
29980 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
29990 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
299a0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
299b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
299c0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
299d0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
299e0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
299f0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
29a00 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
29a10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
29a20 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
29a30 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
29a40 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
29a50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
29a60 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
29a70 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
29a80 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
29a90 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
29aa0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
29ab0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
29ac0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
29ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
29ae0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29af0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
29b00 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
29b10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
29b30 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
29b40 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
29b50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29b60 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
29b70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
29b80 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
29b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29ba0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
29bb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
29bc0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
29bd0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
29be0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
29bf0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
29c00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
29c10 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
29c20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
29c30 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
29c40 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
29c50 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
29c60 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
29c70 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
29c80 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
29c90 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
29ca0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
29cb0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
29cc0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
29cd0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
29ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29cf0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
29d00 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
29d10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
29d20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
29d30 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
29d40 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
29d50 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
29d60 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
29d70 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
29d80 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
29d90 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
29da0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29db0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29dd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29de0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
29df0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
29e00 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
29e10 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
29e20 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
29e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
29e40 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
29e50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29e60 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
29e70 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
29e80 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
29e90 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
29ea0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
29eb0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
29ec0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
29ed0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
29ee0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
29ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
29f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
29f10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29f30 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
29f40 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
29f50 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
29f60 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
29f70 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
29f80 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
29f90 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
29fa0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
29fb0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
29fc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29fd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29fe0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
29ff0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a010 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2a020 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2a030 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
2a040 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
2a050 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
2a060 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
2a070 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2a080 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2a090 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2a0a0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
2a0b0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2a0c0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2a0d0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2a0e0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
2a0f0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
2a100 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
2a110 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
2a120 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
2a130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a140 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
2a150 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
2a160 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
2a170 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a180 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2a190 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2a1a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2a1b0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
2a1c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2a1d0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
2a1e0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
2a1f0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
2a200 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
2a210 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
2a220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2a230 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2a240 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
2a250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
2a260 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
2a270 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2a280 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20  , *pPgno);.     
2a290 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2a2a0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
2a2b0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
2a2c0 6e 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20  ntent, 0);.     
2a2d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a2e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a2f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a300 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2a310 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2a320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a330 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a350 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2a360 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2a370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2a380 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2a390 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2a3a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a3b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2a3c0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
2a3d0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
2a3e0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
2a3f0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
2a400 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
2a410 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
2a420 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
2a430 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
2a440 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
2a450 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2a460 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2a470 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
2a480 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
2a490 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
2a4a0 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
2a4b0 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
2a4c0 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
2a4d0 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
2a4e0 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
2a4f0 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
2a500 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
2a510 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
2a520 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
2a530 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
2a540 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
2a550 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2a560 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2a570 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
2a580 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
2a590 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
2a5a0 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
2a5b0 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2a5c0 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
2a5d0 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
2a5e0 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
2a5f0 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
2a600 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
2a610 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
2a620 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
2a630 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2a640 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
2a650 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
2a660 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
2a670 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
2a680 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
2a690 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
2a6a0 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
2a6b0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2a6c0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
2a6d0 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
2a6e0 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
2a6f0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
2a700 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
2a710 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
2a720 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
2a730 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2a740 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
2a750 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
2a760 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
2a770 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
2a780 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
2a790 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
2a7a0 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
2a7b0 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
2a7c0 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
2a7d0 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
2a7e0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
2a7f0 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
2a800 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a810 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
2a820 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
2a830 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
2a840 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
2a850 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2a860 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
2a870 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
2a880 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2a890 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2a8a0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
2a8b0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2a8c0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2a8d0 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
2a8e0 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
2a8f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2a900 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2a910 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2a920 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
2a930 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
2a940 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
2a950 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
2a960 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
2a970 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
2a980 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
2a990 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
2a9a0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
2a9b0 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
2a9c0 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
2a9d0 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
2a9e0 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
2a9f0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2aa00 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
2aa10 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
2aa20 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
2aa30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
2aa40 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
2aa50 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2aa60 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
2aa70 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
2aa80 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
2aa90 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
2aaa0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
2aab0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2aac0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
2aad0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2aae0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
2aaf0 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
2ab00 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nt, 0);.      if
2ab10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ab20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2ab30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ab40 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
2ab50 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ab60 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
2ab70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2ab80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ab90 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
2aba0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2abb0 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
2abc0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2abd0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
2abe0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2abf0 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
2ac00 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
2ac10 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
2ac20 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
2ac30 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
2ac40 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
2ac50 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
2ac60 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2ac70 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2ac80 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
2ac90 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74   ppPage, bNoCont
2aca0 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ent, 0);.    if(
2acb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2acc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2acd0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
2ace0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
2acf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ad00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ad10 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2ad20 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2ad30 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2ad40 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
2ad50 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
2ad60 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
2ad70 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
2ad80 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2ad90 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
2ada0 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
2adb0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
2adc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2add0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
2ade0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2adf0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
2ae00 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
2ae10 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
2ae20 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
2ae30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2ae40 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
2ae50 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2ae60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2ae70 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
2ae80 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
2ae90 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
2aea0 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2aeb0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2aec0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2aed0 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
2aee0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
2aef0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2af00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2af10 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2af20 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
2af30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2af40 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
2af50 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
2af60 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
2af70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2af80 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
2af90 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
2afa0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2afb0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2afc0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2afd0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
2afe0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
2aff0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
2b000 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
2b010 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
2b020 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
2b030 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
2b040 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
2b050 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
2b060 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
2b070 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
2b080 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
2b090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
2b0a0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
2b0b0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
2b0c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2b0d0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
2b0e0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
2b0f0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
2b100 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2b110 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2b120 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
2b130 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
2b140 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
2b150 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
2b160 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b180 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
2b190 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
2b1a0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1c0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2b1d0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
2b1e0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
2b1f0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
2b200 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
2b210 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
2b220 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
2b230 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2b240 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2b250 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2b260 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
2b270 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
2b280 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2a0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2b2b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
2b2c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2b2e0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2b2f0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
2b300 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
2b310 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2b320 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2b330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
2b340 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
2b350 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
2b360 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
2b370 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
2b380 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
2b390 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
2b3a0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2b3b0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
2b3c0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2b3d0 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
2b3e0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2b3f0 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
2b400 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2b410 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
2b420 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
2b430 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b440 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2b450 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2b460 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2b470 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
2b480 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2b490 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2b4a0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2b4b0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
2b4c0 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
2b4d0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2b4e0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
2b4f0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2b500 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
2b510 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2b520 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
2b530 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
2b540 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
2b550 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
2b560 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2b570 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
2b580 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
2b590 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
2b5a0 70 50 61 67 65 2c 20 30 2c 20 30 29 29 21 3d 30  pPage, 0, 0))!=0
2b5b0 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
2b5c0 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
2b5d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b5e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2b5f0 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
2b600 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2b610 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
2b620 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
2b630 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
2b640 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
2b650 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
2b660 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2b670 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
2b680 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
2b690 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2b6a0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
2b6b0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
2b6c0 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
2b6d0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2b6e0 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
2b6f0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
2b700 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
2b710 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
2b720 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
2b730 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
2b740 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
2b750 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
2b760 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
2b770 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
2b780 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
2b790 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
2b7a0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
2b7b0 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
2b7c0 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
2b7d0 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
2b7e0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2b7f0 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
2b800 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
2b810 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
2b820 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2b830 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
2b840 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
2b850 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
2b860 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
2b870 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
2b880 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
2b890 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
2b8a0 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
2b8b0 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
2b8c0 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
2b8d0 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
2b8e0 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
2b8f0 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
2b900 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
2b910 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
2b920 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
2b930 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
2b940 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
2b950 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2b960 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
2b970 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
2b980 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
2b990 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 2c 20  nk, &pTrunk, 0, 
2b9a0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2b9b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b9c0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2b9d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
2b9e0 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
2b9f0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2ba00 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
2ba10 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
2ba20 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
2ba30 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
2ba40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2ba50 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
2ba60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ba70 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
2ba80 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2ba90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
2baa0 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
2bab0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2bac0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
2bad0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2bae0 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
2baf0 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
2bb00 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
2bb10 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
2bb20 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
2bb30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2bb40 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2bb50 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
2bb60 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
2bb70 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
2bb80 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
2bb90 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
2bba0 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
2bbb0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2bbc0 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
2bbd0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
2bbe0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2bbf0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
2bc00 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
2bc10 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
2bc20 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
2bc30 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
2bc40 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
2bc50 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
2bc60 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
2bc70 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
2bc80 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
2bc90 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
2bca0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
2bcb0 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
2bcc0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
2bcd0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
2bce0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
2bcf0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
2bd00 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
2bd10 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
2bd20 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
2bd30 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
2bd40 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
2bd50 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
2bd60 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
2bd70 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
2bd80 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
2bd90 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
2bda0 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
2bdb0 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
2bdc0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
2bdd0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
2bde0 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
2bdf0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
2be00 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
2be10 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
2be20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2be30 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2be40 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2be50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2be60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2be70 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
2be80 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
2be90 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
2bea0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
2beb0 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
2bec0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
2bed0 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
2bee0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2bef0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
2bf00 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
2bf10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2bf20 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
2bf30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2bf40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2bf50 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
2bf60 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
2bf70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bf80 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2bf90 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
2bfa0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
2bfb0 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
2bfc0 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
2bfd0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2bfe0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
2bff0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
2c000 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
2c010 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
2c020 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2c030 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
2c040 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
2c050 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
2c060 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
2c070 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2c080 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
2c090 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2c0a0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
2c0b0 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
2c0c0 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
2c0d0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
2c0e0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2c0f0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
2c100 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
2c110 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
2c120 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
2c130 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
2c140 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2c150 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
2c160 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
2c170 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
2c180 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2c190 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 2c  Page, &pPage, 0,
2c1a0 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
2c1b0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2c1c0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
2c1d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2c1e0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
2c1f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c200 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
2c210 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2c220 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
2c230 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
2c240 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
2c250 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
2c260 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2c270 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2c280 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
2c290 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
2c2a0 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
2c2b0 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
2c2c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
2c2d0 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
2c2e0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
2c2f0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
2c300 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
2c310 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2c320 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
2c330 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
2c340 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
2c350 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
2c360 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
2c370 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
2c380 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
2c390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
2c3a0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
2c3b0 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
2c3c0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
2c3d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
2c3e0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2c3f0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2c400 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
2c410 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2c420 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
2c430 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
2c440 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
2c450 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2c460 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2c470 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2c480 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
2c490 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2c4a0 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
2c4b0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
2c4c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c4d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2c4e0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2c4f0 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
2c500 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2c510 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
2c520 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
2c530 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2c540 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
2c550 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
2c560 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
2c570 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
2c580 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
2c590 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
2c5a0 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44  ow+3 > pPage->aD
2c5b0 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
2c5c0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
2c5d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2c5e0 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  _BKPT;  /* Cell 
2c5f0 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
2c600 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
2c610 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
2c620 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
2c630 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
2c640 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
2c650 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
2c660 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
2c670 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2c680 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
2c690 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
2c6a0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
2c6b0 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
2c6c0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
2c6d0 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e   assert( ovflPgn
2c6e0 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20  o==0 || nOvfl>0 
2c6f0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
2c700 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
2c710 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
2c720 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
2c730 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
2c740 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
2c750 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
2c760 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
2c770 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
2c780 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
2c790 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
2c7a0 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
2c7b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2c7c0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
2c7d0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
2c7e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
2c7f0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
2c800 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
2c810 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
2c820 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c830 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2c840 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2c850 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
2c860 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
2c870 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
2c880 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
2c890 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2c8a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2c8b0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
2c8c0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
2c8d0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2c8e0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
2c8f0 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
2c900 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
2c910 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
2c920 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
2c930 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
2c940 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
2c950 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
2c960 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
2c970 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
2c980 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
2c990 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
2c9a0 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
2c9b0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
2c9c0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
2c9d0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
2c9e0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
2c9f0 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
2ca00 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
2ca10 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
2ca20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
2ca30 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
2ca40 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
2ca50 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2ca60 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
2ca70 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
2ca80 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
2ca90 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
2caa0 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
2cab0 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
2cac0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
2cad0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
2cae0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
2caf0 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
2cb00 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
2cb10 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
2cb20 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
2cb30 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
2cb40 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
2cb50 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
2cb60 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
2cb70 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
2cb80 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
2cb90 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
2cba0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
2cbb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2cbc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2cbd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2cbe0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
2cbf0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
2cc00 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
2cc10 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
2cc20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2cc30 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
2cc40 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2cc50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2cc60 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
2cc70 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
2cc80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cc90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2cca0 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
2ccb0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
2ccc0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
2ccd0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
2cce0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
2ccf0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
2cd00 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
2cd10 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
2cd20 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
2cd30 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
2cd40 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
2cd50 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
2cd60 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2cd70 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
2cd80 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
2cd90 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
2cda0 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
2cdb0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2cdc0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
2cdd0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
2cde0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2cdf0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
2ce00 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
2ce10 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
2ce20 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
2ce30 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
2ce40 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
2ce50 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
2ce60 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
2ce70 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
2ce80 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
2ce90 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2cea0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
2ceb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ced0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
2cee0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
2cef0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
2cf00 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
2cf10 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
2cf20 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
2cf30 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
2cf40 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
2cf50 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
2cf60 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
2cf70 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
2cf80 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
2cf90 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
2cfa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cfb0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
2cfc0 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
2cfd0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
2cfe0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d000 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
2d010 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
2d020 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
2d030 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
2d040 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
2d050 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
2d060 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
2d070 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
2d080 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
2d090 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
2d0a0 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
2d0b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2d0c0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
2d0d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2d0e0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
2d0f0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
2d100 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
2d110 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
2d120 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2d130 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2d140 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2d150 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
2d160 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
2d170 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
2d180 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
2d190 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
2d1a0 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
2d1b0 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
2d1c0 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
2d1d0 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
2d1e0 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
2d1f0 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
2d200 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2d210 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2d220 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2d230 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2d240 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2d250 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
2d260 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
2d270 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
2d280 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
2d290 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
2d2a0 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
2d2b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
2d2c0 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
2d2d0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
2d2e0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2d2f0 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
2d300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
2d310 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
2d320 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
2d330 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
2d340 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
2d350 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72  4*)&nKey);.  btr
2d360 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2d370 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2d380 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
2d390 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
2d3a0 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
2d3b0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
2d3c0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
2d3d0 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29  nfo.nData==(u32)
2d3e0 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b  (nData+nZero) );
2d3f0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
2d400 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
2d410 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
2d420 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
2d430 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2d440 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
2d450 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
2d460 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
2d470 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
2d480 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b      if( NEVER(nK
2d490 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
2d4a0 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20   pKey==0) ){.   
2d4b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d4c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2d4d0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2d4e0 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  d += (int)nKey;.
2d4f0 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
2d500 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
2d510 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e  )nKey;.  }.  *pn
2d520 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
2d530 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
2d540 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
2d550 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
2d560 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
2d570 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
2d580 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
2d590 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
2d5a0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
2d5b0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
2d5c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d5d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2d5e0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
2d5f0 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
2d600 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
2d610 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2d620 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
2d630 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2d640 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
2d650 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
2d660 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
2d670 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
2d680 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
2d690 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
2d6a0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
2d6b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2d6c0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
2d6d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2d6e0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
2d6f0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2d700 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
2d710 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
2d720 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
2d730 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2d740 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
2d750 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
2d760 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
2d770 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
2d780 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
2d790 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
2d7a0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
2d7b0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
2d7c0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
2d7d0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
2d7e0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
2d7f0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
2d800 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
2d810 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
2d820 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
2d830 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
2d840 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
2d850 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
2d860 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
2d870 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
2d880 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
2d890 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
2d8a0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
2d8b0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
2d8c0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
2d8d0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
2d8e0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
2d8f0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
2d900 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
2d910 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
2d920 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
2d930 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
2d940 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
2d950 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2d960 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
2d970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d980 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
2d990 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
2d9a0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
2d9b0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
2d9c0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
2d9d0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
2d9e0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
2d9f0 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
2da00 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2da10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2da20 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
2da30 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2da40 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
2da50 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2da60 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2da70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2da80 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2da90 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
2daa0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
2dab0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
2dac0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
2dad0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
2dae0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
2daf0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
2db00 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
2db10 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
2db20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2db30 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2db40 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2db50 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2db60 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2db70 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
2db80 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2db90 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2dba0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2dbb0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
2dbc0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2dbd0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2dbe0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
2dbf0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
2dc00 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
2dc10 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2dc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2dc30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2dc40 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2dc50 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2dc60 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
2dc70 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
2dc80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2dc90 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
2dca0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
2dcb0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
2dcc0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
2dcd0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
2dce0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
2dcf0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
2dd00 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
2dd10 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
2dd20 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
2dd30 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
2dd40 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
2dd50 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
2dd60 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
2dd70 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
2dd80 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2dd90 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
2dda0 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
2ddb0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
2ddc0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2ddd0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2dde0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2ddf0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2de00 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2de10 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
2de20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2de30 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
2de40 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
2de50 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
2de60 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
2de70 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
2de80 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
2de90 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
2dea0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
2deb0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
2dec0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
2ded0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
2dee0 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
2def0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2df00 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2df10 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2df20 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2df30 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2df40 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
2df50 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
2df60 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
2df70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
2df80 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
2df90 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
2dfa0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
2dfb0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
2dfc0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
2dfd0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2dfe0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
2dff0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
2e000 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
2e010 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
2e020 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
2e030 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
2e040 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
2e050 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
2e060 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
2e070 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2e080 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
2e090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e0a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
2e0b0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
2e0c0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
2e0d0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
2e0e0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
2e0f0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
2e100 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
2e110 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
2e120 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2e130 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
2e140 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
2e150 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
2e160 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
2e170 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
2e180 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
2e190 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
2e1a0 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
2e1b0 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
2e1c0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2e1d0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
2e1e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
2e1f0 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
2e200 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
2e210 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
2e220 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
2e230 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2e240 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
2e250 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
2e260 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
2e270 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
2e280 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
2e290 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
2e2a0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
2e2b0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
2e2c0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2e2d0 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a   *endPtr;     /*
2e2e0 20 45 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   End of loop */.
2e2f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2e300 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
2e310 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
2e320 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
2e330 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
2e340 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
2e350 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
2e360 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
2e370 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2e380 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
2e390 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
2e3a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
2e3b0 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
2e3c0 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
2e3d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2e3e0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2e3f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2e400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e410 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2e420 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2e430 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2e440 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
2e450 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
2e460 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
2e470 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
2e480 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2e490 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
2e4a0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
2e4b0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
2e4c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2e4d0 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
2e4e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2e4f0 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
2e500 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2e510 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
2e520 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
2e530 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
2e540 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
2e550 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e560 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
2e570 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
2e580 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
2e590 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
2e5a0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
2e5b0 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72  rn;.  }.  endPtr
2e5c0 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
2e5d0 49 64 78 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  Idx[2*pPage->nCe
2e5e0 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72  ll - 2];.  asser
2e5f0 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54  t( (SQLITE_PTR_T
2e600 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30  O_INT(ptr)&1)==0
2e610 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61   );  /* ptr is a
2e620 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69  lways 2-byte ali
2e630 67 6e 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28  gned */.  while(
2e640 20 70 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20   ptr<endPtr ){. 
2e650 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20     *(u16*)ptr = 
2e660 2a 28 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a  *(u16*)&ptr[2];.
2e670 20 20 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20      ptr += 2;.  
2e680 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
2e690 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
2e6a0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
2e6b0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
2e6c0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
2e6d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2e6e0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
2e6f0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
2e700 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
2e710 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
2e720 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
2e730 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
2e740 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
2e750 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
2e760 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
2e770 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
2e780 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
2e790 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
2e7a0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
2e7b0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
2e7c0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
2e7d0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
2e7e0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
2e7f0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
2e800 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
2e810 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
2e820 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
2e830 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2e840 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
2e850 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
2e860 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
2e870 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
2e880 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
2e890 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
2e8a0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
2e8b0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
2e8c0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
2e8d0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
2e8e0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
2e8f0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2e900 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
2e910 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
2e920 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
2e930 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
2e940 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
2e950 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
2e960 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2e970 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
2e980 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2e990 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
2e9a0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
2e9b0 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
2e9c0 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
2e9d0 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
2e9e0 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
2e9f0 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
2ea00 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
2ea10 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
2ea20 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
2ea30 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
2ea40 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
2ea50 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
2ea60 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
2ea70 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
2ea80 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
2ea90 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2eaa0 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
2eab0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
2eac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2ead0 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
2eae0 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
2eaf0 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
2eb00 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
2eb10 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
2eb20 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
2eb30 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
2eb40 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
2eb50 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
2eb60 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
2eb70 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
2eb80 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
2eb90 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
2eba0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2ebb0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2ebc0 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
2ebd0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
2ebe0 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
2ebf0 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
2ec00 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
2ec10 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2ec20 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  er */.  int end;
2ec30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2ec40 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
2ec50 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
2ec60 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2ec70 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
2ec80 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
2ec90 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
2eca0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
2ecb0 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
2ecc0 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
2ecd0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
2ece0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
2ecf0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2ed00 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
2ed10 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
2ed20 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
2ed30 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
2ed40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
2ed50 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
2ed60 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
2ed70 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2ed80 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20  u8 *endPtr;     
2ed90 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
2eda0 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  loop */..  int n
2edb0 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f  Skip = (iChild ?
2edc0 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20   4 : 0);..  if( 
2edd0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
2ede0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
2edf0 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
2ee00 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
2ee10 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
2ee20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
2ee30 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2ee40 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ) && MX_CELL(pPa
2ee50 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
2ee60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2ee70 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
2ee80 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2ee90 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
2eea0 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
2eeb0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
2eec0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2eed0 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
2eee0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2eef0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2ef00 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2ef10 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
2ef20 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
2ef30 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
2ef40 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
2ef50 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
2ef60 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
2ef70 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
2ef80 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
2ef90 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
2efa0 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
2efb0 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
2efc0 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
2efd0 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
2efe0 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
2eff0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
2f000 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
2f010 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
2f020 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
2f030 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
2f040 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
2f050 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
2f060 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
2f070 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
2f080 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
2f090 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
2f0a0 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
2f0b0 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
2f0c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
2f0d0 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
2f0e0 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
2f0f0 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
2f100 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
2f110 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2f120 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
2f130 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2f140 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
2f150 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2f160 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
2f170 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2f180 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
2f190 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
2f1a0 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
2f1b0 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
2f1c0 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
2f1d0 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  apOvfl[0])) );. 
2f1e0 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c     pPage->apOvfl
2f1f0 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  [j] = pCell;.   
2f200 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
2f210 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  ] = (u16)i;.  }e
2f220 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
2f230 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f240 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2f250 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2f260 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f270 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2f280 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2f290 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
2f2a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2f2b0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2f2c0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
2f2d0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2f2e0 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
2f2f0 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
2f300 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
2f310 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
2f320 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2f330 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
2f340 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
2f350 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
2f360 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
2f370 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2f380 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
2f390 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
2f3a0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
2f3b0 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
2f3c0 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
2f3d0 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
2f3e0 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
2f3f0 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
2f400 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2f410 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
2f420 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
2f430 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
2f440 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2f450 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
2f460 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
2f470 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
2f480 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
2f490 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
2f4a0 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
2f4b0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2f4c0 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
2f4d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2f4e0 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
2f4f0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74  d);.    }.    pt
2f500 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a  r = &data[end];.
2f510 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26 64 61      endPtr = &da
2f520 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73  ta[ins];.    ass
2f530 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52  ert( (SQLITE_PTR
2f540 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d  _TO_INT(ptr)&1)=
2f550 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73  =0 );  /* ptr is
2f560 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61   always 2-byte a
2f570 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68  ligned */.    wh
2f580 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74 72 20  ile( ptr>endPtr 
2f590 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36 2a 29  ){.      *(u16*)
2f5a0 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74  ptr = *(u16*)&pt
2f5b0 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72  r[-2];.      ptr
2f5c0 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20   -= 2;.    }.   
2f5d0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2f5e0 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
2f5f0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
2f600 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2f610 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
2f620 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2f630 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2f640 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
2f650 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
2f660 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2f670 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
2f680 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
2f690 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
2f6a0 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
2f6b0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
2f6c0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
2f6d0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
2f6e0 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
2f6f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d     */.      ptrm
2f700 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
2f710 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b  ge, pCell, pRC);
2f720 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2f730 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
2f740 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
2f750 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
2f760 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
2f770 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
2f780 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
2f790 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
2f7a0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
2f7b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2f7c0 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
2f7d0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2f7e0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
2f7f0 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
2f800 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
2f810 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
2f820 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
2f830 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
2f840 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
2f850 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2f860 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
2f870 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65   */.  u16 *aSize
2f880 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
2f890 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
2f8a0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2f8b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2f8c0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
2f8d0 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f  *pCellptr;     /
2f8e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
2f8f0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
2f900 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79  /.  int cellbody
2f910 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2f920 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f   of next cell bo
2f930 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  dy */.  u8 * con
2f940 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
2f950 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  >aData;         
2f960 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2f970 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  o data for pPage
2f980 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2f990 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2f9a0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
2f9b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
2f9c0 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a  eader on pPage *
2f9d0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55  /.  const int nU
2f9e0 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70  sable = pPage->p
2f9f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20  Bt->usableSize; 
2fa00 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
2fa10 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73  f page */..  ass
2fa20 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2fa30 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
2fa40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2fa50 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2fa60 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2fa70 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d   assert( nCell>=
2fa80 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74  0 && nCell<=(int
2fa90 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  )MX_CELL(pPage->
2faa0 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  pBt).           
2fab0 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c   && (int)MX_CELL
2fac0 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
2fad0 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  921);.  assert( 
2fae0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2faf0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2fb00 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
2fb10 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2fb20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65  page has just be
2fb30 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72  en zeroed by zer
2fb40 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73  oPage() */.  ass
2fb50 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2fb60 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2fb70 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  ( get2byteNotZer
2fb80 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d  o(&data[hdr+5])=
2fb90 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70  =nUsable );..  p
2fba0 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67 65  Cellptr = &pPage
2fbb0 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c  ->aCellIdx[nCell
2fbc0 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2fbd0 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2fbe0 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2fbf0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20  ; i--){.    u16 
2fc00 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  sz = aSize[i];. 
2fc10 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32     pCellptr -= 2
2fc20 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d  ;.    cellbody -
2fc30 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79  = sz;.    put2by
2fc40 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c  te(pCellptr, cel
2fc50 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
2fc60 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
2fc70 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73  y], apCell[i], s
2fc80 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79  z);.  }.  put2by
2fc90 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2fca0 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62   nCell);.  put2b
2fcb0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2fcc0 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  , cellbody);.  p
2fcd0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2fce0 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c  nCell*2 + nUsabl
2fcf0 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  e - cellbody);. 
2fd00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
2fd10 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
2fd20 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2fd30 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
2fd40 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
2fd50 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
2fd60 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
2fd70 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
2fd80 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
2fd90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
2fda0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2fdb0 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
2fdc0 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
2fdd0 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2fde0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2fdf0 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
2fe00 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
2fe10 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
2fe20 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
2fe30 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
2fe40 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
2fe50 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2fe60 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
2fe70 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
2fe80 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
2fe90 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
2fea0 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
2feb0 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
2fec0 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
2fed0 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
2fee0 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
2fef0 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
2ff00 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
2ff10 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
2ff20 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
2ff30 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
2ff40 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
2ff50 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
2ff60 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
2ff70 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
2ff80 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ffa0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
2ffb0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2ffc0 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
2ffd0 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
2ffe0 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
2fff0 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
30000 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
30010 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
30020 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
30030 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
30040 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
30050 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
30060 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
30070 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
30080 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
30090 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
300a0 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
300b0 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
300c0 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
300d0 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
300e0 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
300f0 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
30100 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
30110 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
30120 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f  ead of trying to
30130 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
30140 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
30150 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
30160 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
30170 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
30180 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
30190 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
301a0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
301b0 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
301c0 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
301d0 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
301e0 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
301f0 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
30200 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
30210 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
30220 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
30230 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
30240 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
30250 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
30260 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
30270 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
30280 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
30290 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
302a0 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
302b0 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
302c0 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
302d0 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
302e0 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
302f0 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
30300 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
30310 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
30320 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
30330 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
30340 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  ** The pSpace bu
30350 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  ffer is used to 
30360 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72  store a temporar
30370 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69  y copy of the di
30380 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68  vider.** cell th
30390 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  at will be inser
303a0 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ted into pParent
303b0 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f  . Such a cell co
303c0 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a  nsists of a 4.**
303d0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
303e0 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  r followed by a 
303f0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
30400 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65  integer. In othe
30410 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d  r.** words, at m
30420 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65  ost 13 bytes. He
30430 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62  nce the pSpace b
30440 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74  uffer must be at
30450 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74  .** least 13 byt
30460 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
30470 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
30480 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
30490 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67  *pParent, MemPag
304a0 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53  e *pPage, u8 *pS
304b0 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65  pace){.  BtShare
304c0 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70  d *const pBt = p
304d0 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Page->pBt;    /*
304e0 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65   B-Tree Database
304f0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
30500 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
30510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
30520 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
30530 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
30540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30560 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
30570 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20   Pgno pgnoNew;  
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30590 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
305a0 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a  mber of pNew */.
305b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
305c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
305d0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
305e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
305f0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30600 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
30610 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
30620 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
30630 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rflow==1 );..  /
30640 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e  * This error con
30650 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61  dition is now ca
30660 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65  ught prior to re
30670 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63  aching this func
30680 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50  tion */.  if( pP
30690 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20  age->nCell==0 ) 
306a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
306b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f  RRUPT_BKPT;..  /
306c0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
306d0 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65   page. This page
306e0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
306f0 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
30700 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d  f .  ** pPage. M
30710 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ake the parent p
30720 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f  age writable, so
30730 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69   that the new di
30740 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20  vider cell.  ** 
30750 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e  may be inserted.
30760 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f   If both these o
30770 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75  perations are su
30780 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65  ccessful, procee
30790 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  d..  */.  rc = a
307a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
307b0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
307c0 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20  noNew, 0, 0);.. 
307d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
307e0 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70  OK ){..    u8 *p
307f0 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d  Out = &pSpace[4]
30800 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  ;.    u8 *pCell 
30810 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  = pPage->apOvfl[
30820 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  0];.    u16 szCe
30830 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
30840 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
30850 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
30860 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
30870 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30880 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
30890 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
308a0 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
308b0 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
308c0 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
308d0 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
308e0 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
308f0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
30900 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
30910 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
30920 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
30930 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20   &szCell);..    
30940 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
30950 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
30960 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
30970 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
30980 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
30990 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
309a0 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
309b0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
309c0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
309d0 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
309e0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
309f0 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
30a00 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
30a10 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
30a20 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
30a30 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
30a40 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
30a50 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
30a60 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
30a70 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
30a80 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
30a90 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
30aa0 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
30ab0 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
30ac0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
30ad0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
30ae0 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
30af0 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
30b00 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
30b10 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
30b20 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
30b30 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
30b40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
30b50 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
30b60 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
30b70 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
30b80 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
30b90 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
30ba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
30bb0 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
30bc0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  al ){.        pt
30bd0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
30be0 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  New, pCell, &rc)
30bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30c00 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65    .    /* Create
30c10 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
30c20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70  to insert into p
30c30 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69  Parent. The divi
30c40 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20  der cell.    ** 
30c50 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d  consists of a 4-
30c60 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
30c70 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (the page numbe
30c80 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a  r of pPage) and.
30c90 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c      ** a variabl
30ca0 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c  e length key val
30cb0 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  ue (which must b
30cc0 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
30cd0 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   as the.    ** l
30ce0 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50  argest key on pP
30cf0 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  age)..    **.   
30d00 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20   ** To find the 
30d10 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75  largest key valu
30d20 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73  e on pPage, firs
30d30 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74  t find the right
30d40 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65  -most .    ** ce
30d50 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65  ll on pPage. The
30d60 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64   first two field
30d70 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61  s of this cell a
30d80 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  re the .    ** r
30d90 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20  ecord-length (a 
30da0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
30db0 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20  integer at most 
30dc0 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29  32-bits in size)
30dd0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
30de0 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72  key value (a var
30df0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
30e00 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61  eger, may have a
30e10 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a  ny value)..    *
30e20 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74  * The first of t
30e30 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  he while(...) lo
30e40 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20  ops below skips 
30e50 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d  over the record-
30e60 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69  length.    ** fi
30e70 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  eld. The second 
30e80 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20  while(...) loop 
30e90 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76  copies the key v
30ea0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  alue from the.  
30eb0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
30ec0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61  ge into the pSpa
30ed0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a  ce buffer..    *
30ee0 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  /.    pCell = fi
30ef0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
30f00 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
30f10 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
30f20 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
30f30 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38   (*(pCell++)&0x8
30f40 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
30f50 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  p );.    pStop =
30f60 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
30f70 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b  while( ((*(pOut+
30f80 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29  +) = *(pCell++))
30f90 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
30fa0 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  pStop );..    /*
30fb0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
30fc0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
30fd0 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  o pParent. */.  
30fe0 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
30ff0 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e  rent, pParent->n
31000 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69  Cell, pSpace, (i
31010 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29  nt)(pOut-pSpace)
31020 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31030 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c   0, pPage->pgno,
31040 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   &rc);..    /* S
31050 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  et the right-chi
31060 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50  ld pointer of pP
31070 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74  arent to point t
31080 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
31090 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
310a0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
310b0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
310c0 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
310d0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  .  .    /* Relea
310e0 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
310f0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
31100 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65  . */.    release
31110 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  Page(pNew);.  }.
31120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31130 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31140 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
31150 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a  CE */..#if 0./*.
31160 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31170 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
31180 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f  bute anything to
31190 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
311a0 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20  f SQLite..** it 
311b0 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74  is sometimes act
311c0 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69  ivated temporari
311d0 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69  ly while debuggi
311e0 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69  ng code responsi
311f0 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74  ble .** for sett
31200 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  ing pointer-map 
31210 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
31220 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65  ic int ptrmapChe
31230 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ckPages(MemPage 
31240 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50  **apPage, int nP
31250 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  age){.  int i, j
31260 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
31270 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
31280 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65  Pgno n;.    u8 e
31290 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
312a0 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d  Page = apPage[i]
312b0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
312c0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
312d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
312e0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
312f0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
31300 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b  Page->nCell; j++
31310 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  ){.      CellInf
31320 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38  o info;.      u8
31330 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20   *z;.     .     
31340 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50   z = findCell(pP
31350 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62  age, j);.      b
31360 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
31370 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f  (pPage, z, &info
31380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66  );.      if( inf
31390 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
313a0 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c         Pgno ovfl
313b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69   = get4byte(&z[i
313c0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
313d0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
313e0 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65  et(pBt, ovfl, &e
313f0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
31400 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
31410 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
31420 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a  AP_OVERFLOW1 );.
31430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31440 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
31450 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63  {.        Pgno c
31460 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
31470 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  z);.        ptrm
31480 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
31490 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
314a0 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
314b0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
314c0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
314d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
314e0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
314f0 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
31500 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
31510 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
31520 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31530 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  +8]);.      ptrm
31540 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
31550 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
31560 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
31570 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
31580 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
31590 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
315a0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   1;.}.#endif../*
315b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
315c0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70  n is used to cop
315d0 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
315e0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  f the b-tree nod
315f0 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20  e stored .** on 
31600 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
31610 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20  ge pTo. If page 
31620 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20  pFrom was not a 
31630 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a  leaf page, then.
31640 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
31650 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65  ap entries for e
31660 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61  ach child page a
31670 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  re updated so th
31680 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74  at the.** parent
31690 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20   page stored in 
316a0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
316b0 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  is page pTo. If 
316c0 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a  pFrom contained.
316d0 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74  ** any cells wit
316e0 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
316f0 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74  pointers, then t
31700 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
31710 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
31720 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f  entries are also
31730 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
31740 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31750 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a   is page pTo..**
31760 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20  .** If pFrom is 
31770 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69  currently carryi
31780 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ng any overflow 
31790 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69  cells (entries i
317a0 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65  n the.** MemPage
317b0 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29  .apOvfl[] array)
317c0 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63  , they are not c
317d0 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a  opied to pTo. .*
317e0 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
317f0 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20  rning, page pTo 
31800 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  is reinitialized
31810 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74   using btreeInit
31820 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Page()..**.** Th
31830 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  e performance of
31840 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31850 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20  s not critical. 
31860 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
31870 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e  by .** the balan
31880 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61  ce_shallower() a
31890 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nd balance_deepe
318a0 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20  r() procedures, 
318b0 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68  neither of.** wh
318c0 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  ich are called o
318d0 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61  ften under norma
318e0 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  l circumstances.
318f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
31900 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
31910 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20  MemPage *pFrom, 
31920 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e  MemPage *pTo, in
31930 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
31940 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
31950 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
31960 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70   * const pBt = p
31970 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75  From->pBt;.    u
31980 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20  8 * const aFrom 
31990 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a  = pFrom->aData;.
319a0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
319b0 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b  To = pTo->aData;
319c0 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
319d0 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d  FromHdr = pFrom-
319e0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
319f0 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72  int const iToHdr
31a00 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d   = ((pTo->pgno==
31a10 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20  1) ? 100 : 0);. 
31a20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
31a30 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a  nt iData;.  .  .
31a40 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
31a50 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  m->isInit );.   
31a60 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
31a70 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
31a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
31a90 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
31aa0 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e  omHdr+5]) <= (in
31ab0 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
31ac0 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  e );.  .    /* C
31ad0 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e  opy the b-tree n
31ae0 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ode content from
31af0 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
31b00 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20  age pTo. */.    
31b10 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65  iData = get2byte
31b20 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
31b30 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +5]);.    memcpy
31b40 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61  (&aTo[iData], &a
31b50 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74  From[iData], pBt
31b60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61  ->usableSize-iDa
31b70 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ta);.    memcpy(
31b80 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61  &aTo[iToHdr], &a
31b90 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20  From[iFromHdr], 
31ba0 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65  pFrom->cellOffse
31bb0 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65  t + 2*pFrom->nCe
31bc0 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ll);.  .    /* R
31bd0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
31be0 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65   pTo so that the
31bf0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
31c00 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
31c10 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20  re.    ** match 
31c20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68  the new data. Th
31c30 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
31c40 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75   of pTo can actu
31c50 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a  ally fail under.
31c60 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62      ** fairly ob
31c70 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e  scure circumstan
31c80 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ces, even though
31c90 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66   it is a copy of
31ca0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   initialized .  
31cb0 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e    ** page pFrom.
31cc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d  .    */.    pTo-
31cd0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
31ce0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
31cf0 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66  age(pTo);.    if
31d00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31d10 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
31d20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
31d30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
31d40 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
31d50 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
31d60 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
31d70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31d80 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ries.    ** for 
31d90 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
31da0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
31db0 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
31dc0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
31dd0 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  to..    */.    i
31de0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
31df0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
31e00 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
31e10 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pTo);.    }.  }.
31e20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
31e30 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
31e40 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
31e50 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
31e60 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
31e70 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
31e80 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
31e90 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
31ea0 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
31eb0 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
31ec0 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
31ed0 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
31ee0 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
31ef0 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
31f00 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
31f10 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
31f20 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
31f30 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
31f40 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
31f50 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
31f60 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
31f70 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
31f80 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
31f90 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
31fa0 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
31fb0 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
31fc0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
31fd0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
31fe0 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
31ff0 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
32000 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
32010 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
32020 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
32030 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
32040 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
32050 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
32060 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
32070 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
32080 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
32090 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
320a0 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
320b0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
320c0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
320d0 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
320e0 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
320f0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
32100 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
32110 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
32120 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
32130 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
32140 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
32150 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
32160 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
32170 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
32180 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
32190 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
321a0 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
321b0 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
321c0 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
321d0 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
321e0 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
321f0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
32200 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
32210 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
32220 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
32230 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
32240 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
32250 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
32260 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
32270 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
32280 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
32290 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
322a0 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
322b0 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
322c0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
322d0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
322e0 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
322f0 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
32300 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
32310 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
32320 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
32330 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
32340 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
32350 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
32360 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
32370 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
32380 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
32390 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
323a0 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
323b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
323c0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
323d0 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
323e0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
323f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
32400 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
32410 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
32420 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
32430 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
32440 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
32450 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
32460 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65  .** buffer big e
32470 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e  nough to hold on
32480 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65  e page. If while
32490 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
324a0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
324b0 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
324c0 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  t) the parent pa
324d0 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
324e0 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
324f0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
32500 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27  tore the parent'
32510 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
32520 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
32530 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
32540 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
32550 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
32560 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
32570 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
32580 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
32590 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
325a0 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
325b0 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
325c0 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
325d0 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
325e0 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
325f0 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
32600 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
32610 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
32620 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
32630 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
32640 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
32650 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
32660 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
32670 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
32680 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
32690 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
326a0 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53  _MSC_VER) && _MS
326b0 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26 26  C_VER >= 1700 &&
326c0 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29   defined(_M_ARM)
326d0 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a  .#pragma optimiz
326e0 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69  e("", off).#endi
326f0 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  f.static int bal
32700 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
32710 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
32720 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32730 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
32740 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
32750 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
32760 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
32770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32780 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
32790 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
327a0 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
327b0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
327c0 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
327d0 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
327e0 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
327f0 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
32800 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
32810 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
32820 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
32830 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e  oot-page */.  in
32840 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20 20  t bBulk         
32850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32860 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63 61   True if this ca
32870 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  ll is part of a 
32880 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a  bulk load */.){.
32890 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
328a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
328b0 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
328c0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
328d0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
328e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
328f0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
32900 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
32910 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
32920 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
32930 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
32940 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
32950 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  om. */.  int nNe
32960 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
32970 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
32980 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
32990 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  w[] */.  int nOl
329a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
329b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
329c0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
329d0 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  d[] */.  int i, 
329e0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
329f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
32a00 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
32a10 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
32a20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
32a30 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
32a40 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
32a50 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ] */.  int rc = 
32a60 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
32a70 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
32a80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  n code */.  u16 
32a90 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
32aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
32ab0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
32ac0 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
32ad0 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
32ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32af0 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
32b00 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
32b10 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
32b20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
32b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
32b40 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
32b50 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
32b60 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
32b70 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
32b80 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
32b90 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
32ba0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
32bb0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
32bc0 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
32bd0 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
32be0 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
32bf0 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
32c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
32c10 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
32c20 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
32c30 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70  */.  int iOvflSp
32c40 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
32c50 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
32c60 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53  d byte of aOvflS
32c70 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
32c80 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
32c90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
32ca0 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
32cb0 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
32cc0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
32cd0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
32ce0 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
32cf0 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
32d00 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
32d10 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
32d20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
32d30 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
32d40 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
32d50 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
32d60 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
32d70 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
32d80 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
32d90 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52  cing */.  u8 *pR
32da0 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
32db0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
32dc0 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20  on in parent of 
32dd0 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f  right-sibling po
32de0 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61  inter */.  u8 *a
32df0 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20  pDiv[NB-1];     
32e00 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
32e10 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
32e20 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
32e30 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
32e40 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
32e50 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
32e60 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
32e70 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
32e80 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
32e90 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
32ea0 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
32eb0 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
32ec0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
32ed0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
32ee0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
32ef0 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
32f00 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
32f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
32f30 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
32f40 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
32f50 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20  *aSpace1;       
32f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
32f70 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66  ce for copies of
32f80 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
32f90 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fb0 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f    /* Temp var to
32fc0 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75   store a page nu
32fd0 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42  mber in */..  pB
32fe0 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74  t = pParent->pBt
32ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
33000 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
33010 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
33020 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
33030 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
33040 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
33050 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52  ) );..#if 0.  TR
33060 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
33070 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
33080 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
33090 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
330a0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69  t->pgno));.#endi
330b0 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  f..  /* At this 
330c0 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61  point pParent ma
330d0 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  y have at most o
330e0 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ne overflow cell
330f0 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68  . And if.  ** th
33100 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  is overflow cell
33110 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20   is present, it 
33120 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c  must be the cell
33130 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65   with .  ** inde
33140 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68  x iParentIdx. Th
33150 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65  is scenario come
33160 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69  s about when thi
33170 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
33180 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72  is called (indir
33190 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69  ectly) from sqli
331a0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
331b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
331c0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
331d0 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
331e0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  t->nOverflow==1 
331f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
33200 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
33210 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61  =0 || pParent->a
33220 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e  iOvfl[0]==iParen
33230 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
33240 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
33250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33260 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
33270 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
33280 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
33290 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
332a0 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
332b0 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
332c0 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
332d0 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
332e0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
332f0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
33300 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
33310 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
33320 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
33330 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
33340 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
33350 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
33360 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
33370 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
33380 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
33390 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
333a0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
333b0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
333c0 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
333d0 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
333e0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
333f0 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
33400 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
33410 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
33420 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
33430 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
33440 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
33450 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
33460 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
33470 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
33480 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
33490 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61  page, since if a
334a0 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20  ny existed they 
334b0 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61  will.  ** have a
334c0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f  lready been remo
334d0 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20  ved..  */.  i = 
334e0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
334f0 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ow + pParent->nC
33500 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29  ell;.  if( i<2 )
33510 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b  {.    nxDiv = 0;
33520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
33530 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c  sert( bBulk==0 |
33540 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20  | bBulk==1 );.  
33550 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78    if( iParentIdx
33560 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
33570 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78         .      nx
33580 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Div = 0;.    }el
33590 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64  se if( iParentId
335a0 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78  x==i ){.      nx
335b0 44 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b  Div = i-2+bBulk;
335c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
335d0 20 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d    assert( bBulk=
335e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 78 44 69  =0 );.      nxDi
335f0 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31  v = iParentIdx-1
33600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
33610 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e  2-bBulk;.  }.  n
33620 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28  Old = i+1;.  if(
33630 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e   (i+nxDiv-pParen
33640 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70  t->nOverflow)==p
33650 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
33660 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26 70  .    pRight = &p
33670 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
33680 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
33690 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +8];.  }else{.  
336a0 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43    pRight = findC
336b0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
336c0 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
336d0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20  verflow);.  }.  
336e0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
336f0 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65  pRight);.  while
33700 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ( 1 ){.    rc = 
33710 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
33720 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64  Bt, pgno, &apOld
33730 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [i], 0);.    if(
33740 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d   rc ){.      mem
33750 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
33760 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
33770 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge*));.      got
33780 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
33790 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  p;.    }.    nMa
337a0 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
337b0 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
337c0 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
337d0 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d  .    if( (i--)==
337e0 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
337f0 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61  if( i+nxDiv==pPa
33800 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20  rent->aiOvfl[0] 
33810 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  && pParent->nOve
33820 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61  rflow ){.      a
33830 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e  pDiv[i] = pParen
33840 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20  t->apOvfl[0];.  
33850 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
33860 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
33870 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
33880 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
33890 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
338a0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e        pParent->n
338b0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
338c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
338d0 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
338e0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
338f0 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
33900 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70  erflow);.      p
33910 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
33920 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
33930 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
33940 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
33950 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20  apDiv[i]);..    
33960 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65    /* Drop the ce
33970 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ll from the pare
33980 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69  nt page. apDiv[i
33990 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74  ] still points t
339a0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  o.      ** the c
339b0 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70  ell within the p
339c0 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75  arent, even thou
339d0 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  gh it has been d
339e0 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  ropped..      **
339f0 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
33a00 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61  cause dropping a
33a10 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77   cell only overw
33a20 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a  rites the first.
33a30 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
33a40 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74  tes of it, and t
33a50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
33a60 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66  s not need the f
33a70 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
33a80 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
33a90 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f  divider cell. So
33aa0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
33ab0 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20  safe to use.    
33ac0 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20    ** later on.  
33ad0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33ae0 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77 65  ** But not if we
33af0 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d 64   are in secure-d
33b00 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73  elete mode. In s
33b10 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
33b20 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
33b30 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69  dropCell() routi
33b40 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  ne will overwrit
33b50 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  e the entire cel
33b60 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20  l with zeroes.. 
33b70 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
33b80 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c  case, temporaril
33b90 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20  y copy the cell 
33ba0 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70  into the aOvflSp
33bb0 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62  ace[].      ** b
33bc0 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62  uffer. It will b
33bd0 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61  e copied out aga
33be0 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  in as soon as th
33bf0 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65  e aSpace[] buffe
33c00 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  r.      ** is al
33c10 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  located.  */.   
33c20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46     if( pBt->btsF
33c30 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
33c40 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
33c50 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20      int iOff;.. 
33c60 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53 51         iOff = SQ
33c70 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
33c80 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49  apDiv[i]) - SQLI
33c90 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50  TE_PTR_TO_INT(pP
33ca0 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20  arent->aData);. 
33cb0 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66         if( (iOff
33cc0 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29  +szNew[i])>(int)
33cd0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
33ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
33cf0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33d00 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
33d10 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
33d20 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d  , (i+1)*sizeof(M
33d30 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
33d40 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
33d50 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
33d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33d70 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66      memcpy(&aOvf
33d80 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70  lSpace[iOff], ap
33d90 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d  Div[i], szNew[i]
33da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 44  );.          apD
33db0 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70  iv[i] = &aOvflSp
33dc0 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61  ace[apDiv[i]-pPa
33dd0 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20  rent->aData];.  
33de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33df0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
33e00 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
33e10 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
33e20 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72  ow, szNew[i], &r
33e30 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
33e40 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
33e50 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
33e60 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   4 in order to p
33e70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
33e80 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
33e90 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
33ea0 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e  nMaxCells + 3)&~
33eb0 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  3;..  /*.  ** Al
33ec0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
33ed0 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
33ee0 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42  es.  */.  k = pB
33ef0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f  t->pageSize + RO
33f00 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
33f10 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74  age));.  szScrat
33f20 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78  ch =.       nMax
33f30 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a  Cells*sizeof(u8*
33f40 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
33f50 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
33f60 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
33f70 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36  Cells*sizeof(u16
33f80 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
33f90 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
33fa0 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d  l */.     + pBt-
33fb0 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20  >pageSize       
33fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fd0 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
33fe0 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e  e1 */.     + k*n
33ff0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
34000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34010 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
34020 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29   copies (apCopy)
34030 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
34040 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
34050 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29  loc( szScratch )
34060 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  ; .  if( apCell=
34070 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
34080 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
34090 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
340a0 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
340b0 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
340c0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
340d0 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a    aSpace1 = (u8*
340e0 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
340f0 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ls];.  assert( E
34100 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
34110 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a  ENT(aSpace1) );.
34120 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
34130 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
34140 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
34150 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
34160 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
34170 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
34180 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
34190 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
341a0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
341b0 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
341c0 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
341d0 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72   aSpace1[] and r
341e0 65 6d 6f 76 65 20 74 68 65 20 64 69 76 69 64 65  emove the divide
341f0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r cells.  ** fro
34200 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
34210 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
34220 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
34230 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
34240 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
34250 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
34260 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
34270 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
34280 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
34290 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
342a0 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
342b0 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
342c0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
342d0 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
342e0 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
342f0 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
34300 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
34310 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
34320 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
34330 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
34340 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
34350 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
34360 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
34370 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
34380 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
34390 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
343a0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
343b0 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
343c0 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
343d0 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
343e0 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
343f0 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
34400 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
34410 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65   keys..  */.  le
34420 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61  afCorrection = a
34430 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b  pOld[0]->leaf*4;
34440 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70  .  leafData = ap
34450 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b  Old[0]->hasData;
34460 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
34470 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ld; i++){.    in
34480 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20  t limit;.    .  
34490 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
344a0 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
344b0 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   take a copy of 
344c0 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61  the i'th origina
344d0 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a  l sibling.    **
344e0 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   The rest of thi
344f0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
34500 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  use data from th
34510 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a  e copies rather.
34520 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
34530 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
34540 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
34550 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
34560 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  in the.    ** pr
34570 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
34580 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a  verwritten.  */.
34590 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
345a0 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  d = apCopy[i] = 
345b0 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61 63  (MemPage*)&aSpac
345c0 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e1[pBt->pageSize
345d0 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d   + k*i];.    mem
345e0 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b  cpy(pOld, apOld[
345f0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
34600 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e  ge));.    pOld->
34610 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  aData = (void*)&
34620 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  pOld[1];.    mem
34630 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c  cpy(pOld->aData,
34640 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61   apOld[i]->aData
34650 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
34660 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 70  ;..    limit = p
34670 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
34680 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
34690 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  if( pOld->nOverf
346a0 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 66  low>0 ){.      f
346b0 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
346c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   j++){.        a
346d0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
346e0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
346f0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
34700 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
34710 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20  ll(pOld, j);.   
34720 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
34730 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
34740 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
34750 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e  ell]);.        n
34760 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
34770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34780 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 4f 6c   u8 *aData = pOl
34790 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  d->aData;.      
347a0 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d 20 70  u16 maskPage = p
347b0 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a 20  Old->maskPage;. 
347c0 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66       u16 cellOff
347d0 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c  set = pOld->cell
347e0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 66 6f  Offset;.      fo
347f0 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20  r(j=0; j<limit; 
34800 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  j++){.        as
34810 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
34820 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
34830 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
34840 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44 61 74   findCellv2(aDat
34850 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63 65 6c  a, maskPage, cel
34860 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20 20 20  lOffset, j);.   
34870 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
34880 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
34890 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
348a0 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e  ell]);.        n
348b0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
348c0 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20 20 20      }       .   
348d0 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26   if( i<nOld-1 &&
348e0 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20   !leafData){.   
348f0 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36     u16 sz = (u16
34900 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  )szNew[i];.     
34910 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
34920 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
34930 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
34940 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
34950 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65   = sz;.      pTe
34960 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53  mp = &aSpace1[iS
34970 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53  pace1];.      iS
34980 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20  pace1 += sz;.   
34990 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
349a0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20  Bt->maxLocal+23 
349b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
349c0 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69 6e 74   iSpace1 <= (int
349d0 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  )pBt->pageSize )
349e0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
349f0 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Temp, apDiv[i], 
34a00 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c  sz);.      apCel
34a10 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70  l[nCell] = pTemp
34a20 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b  +leafCorrection;
34a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
34a40 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
34a50 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69   || leafCorrecti
34a60 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73  on==4 );.      s
34a70 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
34a80 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c  zCell[nCell] - l
34a90 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
34aa0 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e       if( !pOld->
34ab0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
34ac0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
34ad0 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
34ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
34af0 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20  d->hdrOffset==0 
34b00 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
34b10 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20  e right pointer 
34b20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
34b30 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74  e pOld becomes t
34b40 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  he left.        
34b50 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ** pointer of th
34b60 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  e divider cell *
34b70 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
34b80 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
34b90 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pOld->aData[8],
34ba0 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   4);.      }else
34bb0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
34bc0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
34bd0 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==4 );.        i
34be0 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  f( szCell[nCell]
34bf0 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
34c00 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
34c10 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65  any cells smalle
34c20 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20  r than 4 bytes. 
34c30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43  */.          szC
34c40 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a  ell[nCell] = 4;.
34c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34c60 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  }.      nCell++;
34c70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
34c80 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74  .  ** Figure out
34c90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
34ca0 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68  ages needed to h
34cb0 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65  old all nCell ce
34cc0 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20  lls..  ** Store 
34cd0 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22  this number in "
34ce0 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74  k".  Also comput
34cf0 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20  e szNew[] which 
34d00 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a  is the total.  *
34d10 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  * size of all ce
34d20 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  lls on the i-th 
34d30 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b  page and cntNew[
34d40 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  ] which is the i
34d50 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43  ndex.  ** in apC
34d60 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c  ell[] of the cel
34d70 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70  l that divides p
34d80 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20  age i from page 
34d90 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e  i+1.  .  ** cntN
34da0 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75  ew[k] should equ
34db0 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20  al nCell..  **. 
34dc0 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75   ** Values compu
34dd0 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
34de0 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k:.  **.  **    
34df0 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f         k: The to
34e00 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  tal number of si
34e10 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a  bling pages.  **
34e20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70      szNew[i]: Sp
34e30 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65  aced used on the
34e40 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
34e50 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65  ge..  **   cntNe
34e60 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61  w[i]: Index in a
34e70 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65  pCell[] and szCe
34e80 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72  ll[] for the fir
34e90 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20  st cell to.  ** 
34ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
34eb0 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d   right of the i-
34ec0 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
34ed0 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63  .  ** usableSpac
34ee0 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  e: Number of byt
34ef0 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69  es of space avai
34f00 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69  lable on each si
34f10 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a  bling..  ** .  *
34f20 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20  /.  usableSpace 
34f30 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
34f40 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72  e - 12 + leafCor
34f50 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73  rection;.  for(s
34f60 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69  ubtotal=k=i=0; i
34f70 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
34f80 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78    assert( i<nMax
34f90 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62  Cells );.    sub
34fa0 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b  total += szCell[
34fb0 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20  i] + 2;.    if( 
34fc0 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c  subtotal > usabl
34fd0 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eSpace ){.      
34fe0 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
34ff0 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  tal - szCell[i];
35000 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d  .      cntNew[k]
35010 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
35020 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b  leafData ){ i--;
35030 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61   }.      subtota
35040 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b  l = 0;.      k++
35050 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42  ;.      if( k>NB
35060 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54  +1 ){ rc = SQLIT
35070 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
35080 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
35090 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20  anup; }.    }.  
350a0 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73  }.  szNew[k] = s
350b0 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65  ubtotal;.  cntNe
350c0 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20  w[k] = nCell;.  
350d0 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  k++;..  /*.  ** 
350e0 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70  The packing comp
350f0 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  uted by the prev
35100 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69  ious block is bi
35110 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20  ased toward the 
35120 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e  siblings.  ** on
35130 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20   the left side. 
35140 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e   The left siblin
35150 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65  gs are always ne
35160 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65  arly full, while
35170 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d   the.  ** right-
35180 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67  most sibling mig
35190 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70  ht be nearly emp
351a0 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20  ty.  This block 
351b0 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73  of code attempts
351c0 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20  .  ** to adjust 
351d0 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73  the packing of s
351e0 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61  iblings to get a
351f0 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e   better balance.
35200 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
35210 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f  adjustment is mo
35220 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d  re than an optim
35230 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61  ization.  The pa
35240 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68  cking above migh
35250 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74  t.  ** be so out
35260 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74   of balance as t
35270 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46  o be illegal.  F
35280 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
35290 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
352a0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
352b0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
352c0 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d  y.  This adjustm
352d0 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f  ent is not optio
352e0 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nal..  */.  for(
352f0 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  i=k-1; i>0; i--)
35300 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68  {.    int szRigh
35310 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f  t = szNew[i];  /
35320 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
35330 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  g on the right *
35340 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74  /.    int szLeft
35350 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f   = szNew[i-1]; /
35360 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
35370 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  g on the left */
35380 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20  .    int r;     
35390 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
353a0 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20  x of right-most 
353b0 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62  cell in left sib
353c0 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ling */.    int 
353d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
353e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
353f0 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65  t cell to the le
35400 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c  ft of right sibl
35410 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20  ing */..    r = 
35420 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
35430 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d  .    d = r + 1 -
35440 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61   leafData;.    a
35450 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c  ssert( d<nMaxCel
35460 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ls );.    assert
35470 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( r<nMaxCells );
35480 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69  .    while( szRi
35490 67 68 74 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  ght==0 .       |
354a0 7c 20 28 21 62 42 75 6c 6b 20 26 26 20 73 7a 52  | (!bBulk && szR
354b0 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
354c0 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
354d0 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20 29 7b 0a  [r]+2)) .    ){.
354e0 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
354f0 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
35500 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
35510 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
35520 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
35530 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
35540 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
35550 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
35560 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
35570 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
35580 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
35590 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
355a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
355b0 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
355c0 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
355d0 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
355e0 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20  pPage is.  ** a 
355f0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
35600 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f  e.  A virtual ro
35610 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20  ot page is when 
35620 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20  the real root.  
35630 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ** page is page 
35640 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65  1 and we are the
35650 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74   only child of t
35660 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20  hat page..  **. 
35670 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 54 68 65   ** UPDATE:  The
35680 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
35690 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
356a0 6c 79 20 74 72 75 65 20 69 66 20 74 68 65 20 64  ly true if the d
356b0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c  atabase.  ** fil
356c0 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 54  e is corrupt.  T
356d0 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  he corruption wi
356e0 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64 20 61  ll be detected a
356f0 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65  nd reported late
35700 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70  r.  ** in this p
35710 72 6f 63 65 64 75 72 65 20 73 6f 20 74 68 65 72  rocedure so ther
35720 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
35730 61 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e  act upon it now.
35740 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  .  */.#if 0.  as
35750 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
35760 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
35770 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
35780 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
35790 23 65 6e 64 69 66 0a 0a 20 20 54 52 41 43 45 28  #endif..  TRACE(
357a0 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
357b0 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20  %d %d %d  ",.   
357c0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c   apOld[0]->pgno,
357d0 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
357e0 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apOld[1]->pgno :
357f0 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
35800 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f  ? apOld[2]->pgno
35810 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a   : 0.  ));..  /*
35820 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
35830 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
35840 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
35850 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
35860 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d  /.  if( apOld[0]
35870 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20  ->pgno<=1 ){.   
35880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
35890 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
358a0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
358b0 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46  nup;.  }.  pageF
358c0 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  lags = apOld[0]-
358d0 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
358e0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
358f0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
35900 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
35910 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
35920 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
35930 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
35940 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
35950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35960 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
35970 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
35980 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
35990 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
359a0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
359b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
359c0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
359d0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
359e0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
359f0 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28 62 42 75  New, &pgno, (bBu
35a00 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f 29 2c 20  lk ? 1 : pgno), 
35a10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
35a20 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
35a30 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
35a40 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
35a50 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20        nNew++;.. 
35a60 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
35a70 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
35a80 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
35a90 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
35aa0 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
35ab0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
35ac0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
35ad0 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
35ae0 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
35af0 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
35b00 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
35b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35b20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
35b30 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
35b40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35b50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
35b60 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
35b70 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
35b80 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
35b90 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
35ba0 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
35bb0 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
35bc0 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  ], &rc);.    if(
35bd0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
35be0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
35bf0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
35c00 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
35c10 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
35c20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
35c30 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
35c40 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
35c50 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
35c60 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
35c70 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
35c80 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
35c90 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
35ca0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
35cb0 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
35cc0 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
35cd0 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
35ce0 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
35cf0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
35d00 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
35d10 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
35d20 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
35d30 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
35d40 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
35d50 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
35d60 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
35d70 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
35d80 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
35d90 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
35da0 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
35db0 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
35dc0 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
35dd0 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
35de0 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
35df0 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
35e00 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
35e10 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
35e20 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
35e30 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
35e40 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
35e50 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
35e60 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61      int minV = a
35e70 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
35e80 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
35e90 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
35ea0 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
35eb0 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70   if( apNew[j]->p
35ec0 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  gno<(unsigned)mi
35ed0 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
35ee0 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
35ef0 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d  minV = apNew[j]-
35f00 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  >pgno;.      }. 
35f10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
35f20 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  I>i ){.      Mem
35f30 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
35f40 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
35f50 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
35f60 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
35f70 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
35f80 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
35f90 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64   TRACE(("new: %d
35fa0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
35fb0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
35fc0 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30  \n",.    apNew[0
35fd0 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30  ]->pgno, szNew[0
35fe0 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
35ff0 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20   apNew[1]->pgno 
36000 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
36010 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
36020 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77   nNew>=3 ? apNew
36030 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [2]->pgno : 0, n
36040 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
36050 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
36060 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70  =4 ? apNew[3]->p
36070 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  gno : 0, nNew>=4
36080 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
36090 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61  .    nNew>=5 ? a
360a0 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[4]->pgno : 
360b0 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
360c0 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
360d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
360e0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
360f0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
36100 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  ) );.  put4byte(
36110 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e  pRight, apNew[nN
36120 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  ew-1]->pgno);.. 
36130 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
36140 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
36150 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
36160 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
36170 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
36180 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
36190 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
361a0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
361b0 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
361c0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
361d0 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
361e0 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
361f0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
36200 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
36210 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
36220 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
36230 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
36240 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
36250 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
36260 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
36270 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
36280 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
36290 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
362a0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
362b0 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
362c0 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
362d0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
362e0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20  rflow==0 );..   
362f0 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
36300 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
36310 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
36320 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
36330 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
36340 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
36350 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
36360 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
36370 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
36380 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
36390 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d  ( i<nNew-1 || j=
363a0 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  =nCell );.    if
363b0 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ( j<nCell ){.   
363c0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
363d0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
363e0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
363f0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
36400 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
36410 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
36420 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
36430 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
36440 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
36450 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53   pTemp = &aOvflS
36460 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d  pace[iOvflSpace]
36470 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
36480 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
36490 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
364a0 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
364b0 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
364c0 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
364d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
364e0 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
364f0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
36500 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
36510 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
36520 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
36530 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
36540 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
36550 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
36560 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
36570 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
36580 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
36590 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
365a0 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
365b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
365c0 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
365d0 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
365e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
365f0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
36600 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
36610 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
36620 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c  rseCellPtr(pNew,
36630 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66   apCell[j], &inf
36640 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  o);.        pCel
36650 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20  l = pTemp;.     
36660 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56     sz = 4 + putV
36670 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
36680 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20   info.nKey);.   
36690 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
366a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
366b0 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
366c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
366d0 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
366e0 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
366f0 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
36700 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
36710 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
36720 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
36730 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
36740 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
36750 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
36760 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
36770 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
36780 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
36790 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
367a0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
367b0 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
367c0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
367d0 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
367e0 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
367f0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
36800 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
36810 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
36820 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
36830 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
36840 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
36850 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
36860 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
36870 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
36880 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
36890 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
368a0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
368b0 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
368c0 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
368d0 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
368e0 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
368f0 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
36900 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
36910 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
36920 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
36930 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
36940 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
36950 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
36960 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
36970 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
36980 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
36990 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
369a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
369b0 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61  }.      iOvflSpa
369c0 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
369d0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
369e0 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
369f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
36a00 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74  vflSpace <= (int
36a10 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  )pBt->pageSize )
36a20 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65  ;.      insertCe
36a30 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
36a40 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
36a50 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  emp, pNew->pgno,
36a60 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
36a70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36a80 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
36a90 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
36aa0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
36ab0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36ac0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
36ad0 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
36ae0 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
36af0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
36b00 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
36b10 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
36b20 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
36b30 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
36b40 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
36b50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
36b60 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
36b70 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
36b80 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
36b90 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
36ba0 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
36bb0 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
36bc0 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
36bd0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
36be0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
36bf0 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
36c00 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
36c10 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
36c20 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
36c30 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
36c40 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
36c50 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
36c60 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
36c70 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
36c80 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
36c90 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
36ca0 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
36cb0 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
36cc0 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
36cd0 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
36ce0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
36cf0 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
36d00 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
36d10 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
36d20 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
36d30 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
36d40 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
36d50 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
36d60 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
36d70 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
36d80 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
36d90 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
36da0 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
36db0 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
36dc0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
36dd0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
36de0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
36df0 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
36e00 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
36e10 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
36e20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
36e30 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
36e40 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
36e50 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
36e60 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
36e70 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
36e80 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
36e90 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
36ea0 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
36eb0 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
36ec0 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
36ed0 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
36ee0 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
36ef0 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
36f00 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
36f10 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
36f20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
36f30 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
36f40 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
36f50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
36f60 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
36f70 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
36f80 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
36f90 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
36fa0 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
36fb0 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
36fc0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70   .    );.    cop
36fd0 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e  yNodeContent(apN
36fe0 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20  ew[0], pParent, 
36ff0 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61  &rc);.    freePa
37000 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63  ge(apNew[0], &rc
37010 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49  );.  }else if( I
37020 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
37030 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
37040 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
37050 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
37060 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
37070 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
37080 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
37090 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
370a0 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
370b0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
370c0 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
370d0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
370e0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
370f0 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
37100 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
37110 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
37120 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
37130 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
37140 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
37150 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
37160 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
37170 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
37180 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
37190 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
371a0 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
371b0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
371c0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
371d0 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
371e0 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
371f0 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
37200 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
37210 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
37220 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
37230 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
37240 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
37250 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
37260 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
37270 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
37280 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
37290 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
372a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
372b0 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
372c0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
372d0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
372e0 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
372f0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
37300 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
37310 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
37320 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
37330 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
37340 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
37350 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
37360 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
37370 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
37380 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
37390 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
373a0 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
373b0 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
373c0 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
373d0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
373e0 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
373f0 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
37400 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
37410 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
37420 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
37430 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
37440 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
37450 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
37460 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
37470 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
37480 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
37490 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
374a0 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
374b0 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
374c0 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
374d0 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
374e0 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
374f0 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
37500 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
37510 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
37520 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
37530 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
37540 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
37550 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
37560 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
37570 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
37580 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
37590 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
375a0 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
375b0 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
375c0 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
375d0 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
375e0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
375f0 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
37600 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
37610 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
37620 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
37630 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
37640 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
37650 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
37660 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
37670 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
37680 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
37690 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
376a0 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
376b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
376c0 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
376d0 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
376e0 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
376f0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
37700 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
37710 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
37720 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
37730 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
37740 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
37750 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
37760 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
37770 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
37780 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
37790 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
377a0 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d   pOld->aiOvfl[0]
377b0 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20   : -1);.    j = 
377c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
377d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
377e0 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20  * Current 'old' 
377f0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a  sibling page */.
37800 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20      k = 0;      
37810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37820 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
37830 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20  t 'new' sibling 
37840 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  page */.    for(
37850 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
37860 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  +){.      int is
37870 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20  Divider = 0;.   
37880 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65     while( i==iNe
37890 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  xtOld ){.       
378a0 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
378b0 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
378c0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
378d0 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c   last cell on ol
378e0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  d.        ** sib
378f0 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20  ling page j. If 
37900 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
37910 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
37920 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
37930 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
37940 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20  then cell i was 
37950 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
37960 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
37970 74 28 20 6a 2b 31 20 3c 20 41 72 72 61 79 53 69  t( j+1 < ArraySi
37980 7a 65 28 61 70 43 6f 70 79 29 20 29 3b 0a 20 20  ze(apCopy) );.  
37990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 2b        assert( j+
379a0 31 20 3c 20 6e 4f 6c 64 20 29 3b 0a 20 20 20 20  1 < nOld );.    
379b0 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70      pOld = apCop
379c0 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  y[++j];.        
379d0 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21  iNextOld = i + !
379e0 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
379f0 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e  >nCell + pOld->n
37a00 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
37a10 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65    if( pOld->nOve
37a20 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
37a30 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70     nOverflow = p
37a40 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
37a50 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
37a60 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  low = i + !leafD
37a70 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 69 4f 76  ata + pOld->aiOv
37a80 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 7d  fl[0];.        }
37a90 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64  .        isDivid
37aa0 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20  er = !leafData; 
37ab0 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
37ac0 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
37ad0 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77  w>0 || iOverflow
37ae0 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  <i );.      asse
37af0 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c  rt(nOverflow<2 |
37b00 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30  | pOld->aiOvfl[0
37b10 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b  ]==pOld->aiOvfl[
37b20 31 5d 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73  1]-1);.      ass
37b30 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20  ert(nOverflow<3 
37b40 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b  || pOld->aiOvfl[
37b50 31 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c  1]==pOld->aiOvfl
37b60 5b 32 5d 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  [2]-1);.      if
37b70 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29  ( i==iOverflow )
37b80 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  {.        isDivi
37b90 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
37ba0 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f   if( (--nOverflo
37bb0 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w)>0 ){.        
37bc0 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20    iOverflow++;. 
37bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37be0 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63  ..      if( i==c
37bf0 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20  ntNew[k] ){.    
37c00 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
37c10 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
37c20 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
37c30 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
37c40 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   new.        ** 
37c50 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20  sibling page k. 
37c60 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
37c70 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
37c80 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
37c90 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
37ca0 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69  e, then cell i i
37cb0 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
37cc0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
37cd0 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b  ew = apNew[++k];
37ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
37cf0 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75  afData ) continu
37d00 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
37d10 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20   assert( j<nOld 
37d20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
37d30 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20   k<nNew );..    
37d40 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
37d50 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
37d60 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e  divider cell (an
37d70 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72  d is not now) or
37d80 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65  .      ** an ove
37d90 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69  rflow cell, or i
37da0 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c  f the cell was l
37db0 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66  ocated on a diff
37dc0 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20  erent sibling.  
37dd0 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f      ** page befo
37de0 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  re the balancing
37df0 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
37e00 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  er map entries a
37e10 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20  ssociated.      
37e20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c  ** with any chil
37e30 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  d or overflow pa
37e40 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75  ges need to be u
37e50 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  pdated.  */.    
37e60 20 20 69 66 28 20 69 73 44 69 76 69 64 65 72 20    if( isDivider 
37e70 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70  || pOld->pgno!=p
37e80 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
37e90 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f       if( !leafCo
37ea0 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
37eb0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
37ec0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70  pBt, get4byte(ap
37ed0 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50  Cell[i]), PTRMAP
37ee0 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
37ef0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
37f00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
37f10 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e  szCell[i]>pNew->
37f20 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
37f30 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
37f40 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  vflPtr(pNew, apC
37f50 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  ell[i], &rc);.  
37f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37f70 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
37f80 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
37f90 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
37fa0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
37fb0 20 20 20 20 20 20 20 75 33 32 20 6b 65 79 20 3d         u32 key =
37fc0 20 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77   get4byte(&apNew
37fd0 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  [i]->aData[8]);.
37fe0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
37ff0 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d  t(pBt, key, PTRM
38000 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
38010 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  i]->pgno, &rc);.
38020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
38030 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20  if 0.    /* The 
38040 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
38050 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65  () contains asse
38060 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
38070 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74  that verify that
38080 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e  .    ** all poin
38090 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 72  ter map pages ar
380a0 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  e set correctly.
380b0 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c   This is helpful
380c0 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64   while .    ** d
380d0 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69  ebugging. This i
380e0 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c  s usually disabl
380f0 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 72  ed because a cor
38100 72 75 70 74 20 64 61 74 61 62 61 73 65 20 6d 61  rupt database ma
38110 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61  y.    ** cause a
38120 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
38130 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a  ment to fail.  *
38140 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  /.    ptrmapChec
38150 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e  kPages(apNew, nN
38160 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43  ew);.    ptrmapC
38170 68 65 63 6b 50 61 67 65 73 28 26 70 50 61 72 65  heckPages(&pPare
38180 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  nt, 1);.#endif. 
38190 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
381a0 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
381b0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
381c0 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c  CE: finished: ol
381d0 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
381e0 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
381f0 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e     nOld, nNew, n
38200 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  Cell));..  /*.  
38210 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72  ** Cleanup befor
38220 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
38230 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  /.balance_cleanu
38240 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  p:.  sqlite3Scra
38250 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
38260 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
38270 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
38280 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
38290 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
382a0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
382b0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
382c0 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
382d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
382e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
382f0 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
38300 45 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65  ER >= 1700 && de
38310 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70  fined(_M_ARM).#p
38320 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22  ragma optimize("
38330 22 2c 20 6f 6e 29 0a 23 65 6e 64 69 66 0a 0a 0a  ", on).#endif...
38340 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38350 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
38360 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  en the root page
38370 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72   of a b-tree str
38380 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65  ucture is.** ove
38390 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f  rfull (has one o
383a0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
383b0 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20  pages)..**.** A 
383c0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69  new child page i
383d0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
383e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
383f0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74  the current root
38400 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64  .** page, includ
38410 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ing overflow cel
38420 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69  ls, are copied i
38430 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54  nto the child. T
38440 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
38450 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74  is then overwrit
38460 74 65