/ Hex Artifact Content
Login

Artifact c1235eacb8d4de12850daccb1636763218da3381:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f  >schemaFlags&DB_
1670: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30  SchemaLoaded)==0
1680: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1690: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  1;.  }..  /* Fig
16a0: 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74  ure out the root
16b0: 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20 6c  -page that the l
16c0: 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65  ock should be he
16d0: 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65  ld on. For table
16e0: 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74  .  ** b-trees, t
16f0: 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65 20  his is just the 
1700: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
1710: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65   b-tree being re
1720: 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74  ad or.  ** writt
1730: 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d  en. For index b-
1740: 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68 65  trees, it is the
1750: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1760: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  e associated.  *
1770: 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  * table.  */.  i
1780: 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20  f( isIndex ){.  
1790: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
17a0: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
17b0: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
17c0: 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20  a->idxHash); p; 
17d0: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
17e0: 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  (p)){.      Inde
17f0: 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78  x *pIdx = (Index
1800: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
1810: 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  a(p);.      if( 
1820: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74  pIdx->tnum==(int
1830: 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  )iRoot ){.      
1840: 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70    iTab = pIdx->p
1850: 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20  Table->tnum;.   
1860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1870: 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69  se{.    iTab = i
1880: 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Root;.  }..  /* 
1890: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 72  Search for the r
18a0: 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69  equired lock. Ei
18b0: 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63  ther a write-loc
18c0: 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69  k on root-page i
18d0: 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69  Tab, a .  ** wri
18e0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73  te-lock on the s
18f0: 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20  chema table, or 
1900: 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69  (if the client i
1910: 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a  s reading) a.  *
1920: 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69  * read-lock on i
1930: 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65  Tab will suffice
1940: 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e  . Return 1 if an
1950: 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 66  y of these are f
1960: 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  ound.  */.  for(
1970: 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42  pLock=pBtree->pB
1980: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
1990: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
19a0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  ext){.    if( pL
19b0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74  ock->pBtree==pBt
19c0: 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c  ree .     && (pL
19d0: 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ock->iTable==iTa
19e0: 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f  b || (pLock->eLo
19f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26  ck==WRITE_LOCK &
1a00: 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d  & pLock->iTable=
1a10: 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f  =1)).     && pLo
1a20: 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b  ck->eLock>=eLock
1a30: 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Type .    ){.   
1a40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1a50: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69   }.  }..  /* Fai
1a60: 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  led to find the 
1a70: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a  required lock. *
1a80: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
1a90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1aa0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  _DEBUG */..#ifde
1ab0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1ac0: 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63  *.**** This func
1ad0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64  tion may be used
1ae0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
1af0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b00: 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  only. ****.**.**
1b10: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b20: 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c 65  it would be ille
1b30: 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74  gal for pBtree t
1b40: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
1b50: 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  .** table or ind
1b60: 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52 6f  ex rooted at iRo
1b70: 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65 72  ot because other
1b80: 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69   shared connecti
1b90: 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75 6c  ons are.** simul
1ba0: 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69 6e  taneously readin
1bb0: 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62 6c  g that same tabl
1bc0: 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e or index..**.*
1bd0: 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
1be0: 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72  for pBtree to wr
1bf0: 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ite if some othe
1c00: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 74  r Btree object t
1c10: 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74 68  hat.** shares th
1c20: 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64 20  e same BtShared 
1c30: 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65 6e  object is curren
1c40: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 77  tly reading or w
1c50: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69 52  riting.** the iR
1c60: 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63 65  oot table.  Exce
1c70: 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65 72  pt, if the other
1c80: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68 61   Btree object ha
1c90: 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75 6e  s the.** read-un
1ca0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
1cb0: 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 4f  et, then it is O
1cc0: 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 20  K for the other 
1cd0: 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61 76  object to.** hav
1ce0: 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72 2e  e a read cursor.
1cf0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1d00: 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74 69  le, before writi
1d10: 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20 6f  ng to any part o
1d20: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
1d30: 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20 61  ndex.** rooted a
1d40: 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f 6e  t page iRoot, on
1d50: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a 2a  e should call:.*
1d60: 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20  *.**    assert( 
1d70: 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
1d80: 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 29  s(pBtree, iRoot)
1d90: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
1da0: 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63  t hasReadConflic
1db0: 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  ts(Btree *pBtree
1dc0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20  , Pgno iRoot){. 
1dd0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1de0: 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1df0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1e00: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1e10: 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1e20: 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26 20  =iRoot .     && 
1e30: 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72 65  p->pBtree!=pBtre
1e40: 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70 2d  e.     && 0==(p-
1e50: 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61  >pBtree->db->fla
1e60: 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64  gs & SQLITE_Read
1e70: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20 20  Uncommitted).   
1e80: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e90: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1ea0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1eb0: 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20  if    /* #ifdef 
1ec0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1ed0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
1ee0: 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61 6e  see if Btree han
1ef0: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
1f00: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
1f10: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
1f20: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
1f30: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
1f40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
1f50: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
1f60: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
1f70: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
1f80: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
1f90: 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61  g.** setSharedCa
1fa0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c  cheTableLock()),
1fb0: 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   or SQLITE_LOCKE
1fc0: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
1fd0: 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61  tic int querySha
1fe0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1ff0: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2000: 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29   iTab, u8 eLock)
2010: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2020: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
2030: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2040: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2050: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2060: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2070: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2080: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2090: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
20a0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  ( p->db!=0 );.  
20b0: 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d  assert( !(p->db-
20c0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
20d0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c 7c  adUncommitted)||
20e0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
20f0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
2100: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
2110: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2120: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2130: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2140: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2150: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2160: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2170: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2180: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2190: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
21a0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
21b0: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
21c0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
21d0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
21e0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
21f0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
2200: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
2210: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2220: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2230: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2240: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2250: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2260: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2270: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2280: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2290: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
22a0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
22b0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
22c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
22e0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
22f0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
2300: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2310: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2320: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2330: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2340: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2350: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2360: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2370: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2390: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
23a0: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
23b0: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
23c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
23d0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
23e0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
23f0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2400: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2410: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2420: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2430: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2440: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2450: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2460: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2470: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2480: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2490: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
24a0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
24b0: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
24c0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
24d0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
24e0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
24f0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
2500: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
2510: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2520: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2530: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2540: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2550: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2560: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2570: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2580: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2590: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
25a0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
25b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
25c0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
25d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
25e0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
25f0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
2600: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2610: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2620: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2630: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2640: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2650: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2660: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2670: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2680: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2690: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
26a0: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
26b0: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
26c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
26d0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
26e0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
26f0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
2700: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
2710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2720: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2730: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2750: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2770: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2780: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2790: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
27a0: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
27b0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
27c0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
27d0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
27e0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
27f0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
2800: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
2810: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2820: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2830: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2840: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2850: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2860: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2870: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2880: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2890: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
28a0: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
28b0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
28c0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
28d0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
28e0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
28f0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
2900: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
2910: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2920: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2930: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2940: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2950: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2960: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2970: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2980: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2990: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
29a0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
29b0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29c0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
29d0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
29e0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
29f0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2a00: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2a10: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2a20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2a30: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a40: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2a50: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2a60: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2a70: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2a80: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2a90: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2aa0: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2ab0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ac0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2ad0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2ae0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2af0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2b00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2b10: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2b20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2b30: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2b40: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2b50: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2b60: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2b70: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2b80: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2b90: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2ba0: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2bb0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2bc0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2bd0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2be0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2bf0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2c00: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2c10: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2c20: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2c30: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2c40: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2c50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2c60: 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  d) || eLock==WRI
2c70: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  TE_LOCK );..  /*
2c80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2c90: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2ca0: 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62  lled on a sharab
2cb0: 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20  le b-tree after 
2cc0: 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  it .  ** has bee
2cd0: 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  n determined tha
2ce0: 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65  t no other b-tre
2cf0: 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69  e holds a confli
2d00: 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a  cting lock.  */.
2d10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61    assert( p->sha
2d20: 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  rable );.  asser
2d30: 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75  t( SQLITE_OK==qu
2d40: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
2d50: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
2d60: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
2d70: 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20  /* First search 
2d80: 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20  the list for an 
2d90: 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e  existing lock on
2da0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
2db0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
2dc0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2dd0: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2de0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  t){.    if( pIte
2df0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
2e00: 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72  e && pIter->pBtr
2e10: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70  ee==p ){.      p
2e20: 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20  Lock = pIter;.  
2e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2e50: 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64  e above search d
2e60: 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74  id not find a Bt
2e70: 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f  Lock struct asso
2e80: 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a  ciating Btree p.
2e90: 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20    ** with table 
2ea0: 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65  iTable, allocate
2eb0: 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74   one and link it
2ec0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a   into the list..
2ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63    */.  if( !pLoc
2ee0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  k ){.    pLock =
2ef0: 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74   (BtLock *)sqlit
2f00: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
2f10: 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20  eof(BtLock));.  
2f20: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
2f30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2f50: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  .    pLock->iTab
2f60: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
2f70: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d   pLock->pBtree =
2f80: 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70   p;.    pLock->p
2f90: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
2fa0: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63  k;.    pBt->pLoc
2fb0: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = pLock;.  }..
2fc0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c    /* Set the BtL
2fd0: 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ock.eLock variab
2fe0: 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  le to the maximu
2ff0: 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  m of the current
3000: 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74   lock.  ** and t
3010: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
3020: 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  k. This means if
3030: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61   a write-lock wa
3040: 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20  s already held. 
3050: 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c   ** and a read-l
3060: 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77  ock requested, w
3070: 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63  e don't incorrec
3080: 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68  tly downgrade th
3090: 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61  e lock..  */.  a
30a0: 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43  ssert( WRITE_LOC
30b0: 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20  K>READ_LOCK );. 
30c0: 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b   if( eLock>pLock
30d0: 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ->eLock ){.    p
30e0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c  Lock->eLock = eL
30f0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ock;.  }..  retu
3100: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3110: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
3120: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3130: 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
3140: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3150: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52  ED_CACHE./*.** R
3160: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74  elease all the t
3170: 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b  able locks (lock
3180: 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63  s obtained via c
3190: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73  alls to.** the s
31a0: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
31b0: 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75  leLock() procedu
31c0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
31d0: 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a  e object p..**.*
31e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72  assumes that Btr
3200: 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e  ee p has an open
3210: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a   read or write .
3220: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3230: 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20  If it does not, 
3240: 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e  then the BTS_PEN
3250: 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79  DING flag.** may
3260: 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   be incorrectly 
3270: 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
3280: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c  ic void clearAll
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
32b0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32c0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
32d0: 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26  ock **ppIter = &
32e0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61  pBt->pLock;..  a
32f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
3300: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
3310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3320: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d  >sharable || 0==
3330: 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73  *ppIter );.  ass
3340: 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
3350: 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  0 );..  while( *
3360: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
3370: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
3380: 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72  pIter;.    asser
3390: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
33a0: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
33b0: 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  E)==0 || pBt->pW
33c0: 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42  riter==pLock->pB
33d0: 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65  tree );.    asse
33e0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  rt( pLock->pBtre
33f0: 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63  e->inTrans>=pLoc
3400: 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k->eLock );.    
3410: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
3420: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
3430: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
3440: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Next;.      asse
3450: 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  rt( pLock->iTabl
3460: 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26  e!=1 || pLock==&
3470: 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  p->lock );.     
3480: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62   if( pLock->iTab
3490: 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  le!=1 ){.       
34a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
34b0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ock);.      }.  
34c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
34d0: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
34e0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
34f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ..  assert( (pBt
3500: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3510: 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20  _PENDING)==0 || 
3520: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
3530: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3540: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74  er==p ){.    pBt
3550: 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20  ->pWriter = 0;. 
3560: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3570: 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53   &= ~(BTS_EXCLUS
3580: 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29  IVE|BTS_PENDING)
3590: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
35a0: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
35b0: 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =2 ){.    /* Thi
35c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
35d0: 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20  lled when Btree 
35e0: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
35f0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
3600: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
3610: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
3620: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
3630: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
3640: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3650: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3660: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3670: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3680: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3690: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
36a0: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
36b0: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
36c0: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
36d0: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
36e0: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
36f0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
3700: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
3710: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
3720: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73   BTS_PENDING mus
3730: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3740: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3750: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3760: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3770: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3780: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3790: 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a  = ~BTS_PENDING;.
37a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
37b0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67  s function chang
37c0: 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63  es all write-loc
37d0: 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  ks held by Btree
37e0: 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63   p into read-loc
37f0: 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ks..*/.static vo
3800: 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  id downgradeAllS
3810: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
3820: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
3830: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3840: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
3850: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3860: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3870: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
3880: 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Writer = 0;.    
3890: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
38a0: 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45   ~(BTS_EXCLUSIVE
38b0: 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20  |BTS_PENDING);. 
38c0: 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74     for(pLock=pBt
38d0: 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20  ->pLock; pLock; 
38e0: 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65  pLock=pLock->pNe
38f0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
3900: 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d  t( pLock->eLock=
3910: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c  =READ_LOCK || pL
3920: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3930: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65  ;.      pLock->e
3940: 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
3950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
3960: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3970: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3980: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
3990: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
39a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
39b0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
39c0: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
39d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
39e0: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
39f0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3a00: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3a10: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3a20: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3a30: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3a40: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3a50: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3a60: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3a70: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3a80: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3a90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3aa0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
3ab0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3ac0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3ad0: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3ae0: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3af0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3b00: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3b10: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3b20: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3b30: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3b40: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3b50: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3b60: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3b70: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3b80: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3b90: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3ba0: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3bb0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3bc0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3bd0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3be0: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3bf0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3c00: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3c10: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3c20: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3c30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3c50: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3c60: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3c70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3c80: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
3c90: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
3ca0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3cb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
3cc0: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
3cd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3ce0: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
3cf0: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
3d00: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
3d10: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
3d20: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
3d30: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
3d40: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
3d50: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
3d60: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
3d70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
3d80: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
3d90: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
3da0: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
3db0: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
3dc0: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
3dd0: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
3de0: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
3df0: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
3e00: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
3e10: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
3e20: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
3e30: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
3e40: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
3e50: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
3e60: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3e70: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
3e80: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
3e90: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
3ea0: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
3eb0: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
3ec0: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
3ed0: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
3ee0: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
3ef0: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
3f00: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
3f10: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3f20: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
3f30: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
3f40: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
3f50: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
3f60: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
3f70: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
3f80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
3f90: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
3fa0: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
3fb0: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
3fc0: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
3fd0: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
3fe0: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
3ff0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4000: 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
4010: 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
4020: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
4030: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
4040: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
4050: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
4060: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
4070: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  xt){.    if( (p-
4080: 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
4090: 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 26 26  _Incrblob)!=0 &&
40a0: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
40b0: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
40c0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
40d0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
40e0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
40f0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
4100: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
4110: 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69   when INCRBLOB i
4120: 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23  s omitted */.  #
4130: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
4140: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
4150: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
4160: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
4170: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
4180: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
4190: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
41a0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
41b0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
41c0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
41d0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
41e0: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
41f0: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
4200: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
4210: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
4220: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4230: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
4240: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
4250: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
4260: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
4270: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
4280: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
4290: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
42a0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
42b0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
42c0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
42d0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
42e0: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
42f0: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
4300: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
4310: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4320: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
4330: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
4340: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
4350: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
4360: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
4370: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
4380: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
4390: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
43a0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
43b0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
43c0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
43d0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
43e0: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
43f0: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4400: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4410: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4420: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4430: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4440: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4450: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4460: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4470: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4480: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
4490: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
44a0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
44b0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
44c0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
44d0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
44e0: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
44f0: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4500: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4510: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4520: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4530: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4540: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4550: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4560: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4570: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
4580: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
4590: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
45a0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
45b0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
45c0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
45d0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
45e0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
45f0: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4600: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4610: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4620: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4630: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4640: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4650: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4660: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4670: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
4680: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
4690: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
46a0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
46b0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
46c0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
46d0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
46e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
46f0: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4700: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4710: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4720: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4730: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4740: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4750: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4760: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4770: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
4780: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
4790: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
47a0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
47b0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
47c0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
47d0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
47e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
47f0: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4800: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4810: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4820: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4830: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4840: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4850: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4860: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4870: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
4880: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4890: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
48a0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
48b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
48c0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
48d0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
48e0: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
48f0: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4900: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4910: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4920: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4930: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4940: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4950: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4960: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4970: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4980: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
4990: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
49a0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49b0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
49c0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
49d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
49e0: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
49f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4a00: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4a10: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4a20: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4a30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4a40: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4a50: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4a60: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4a70: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
4a80: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
4a90: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
4aa0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
4ab0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
4ac0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
4ad0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4ae0: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
4af0: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
4b00: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
4b10: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
4b20: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4b30: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
4b40: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
4b50: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
4b60: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
4b70: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
4b80: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
4b90: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
4ba0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
4bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
4bc0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
4bd0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4be0: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
4bf0: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
4c00: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
4c10: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
4c20: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
4c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4c40: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
4c50: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4c60: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
4c70: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
4c80: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
4c90: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ca0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
4cb0: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20   Release all of 
4cc0: 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67  the apPage[] pag
4cd0: 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e  es for a cursor.
4ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4cf0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
4d00: 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75 72  ursorPages(BtCur
4d10: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4d20: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4d30: 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
4d40: 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
4d50: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
4d60: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72  ge[i]);.    pCur
4d70: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4d80: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61  .  }.  pCur->iPa
4d90: 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ge = -1;.}.../*.
4da0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
4db0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
4dc0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
4dd0: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
4de0: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
4df0: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
4e00: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
4e10: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
4e20: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
4e30: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
4e40: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
4e50: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
4e60: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
4e70: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
4e80: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
4e90: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
4ea0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
4eb0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
4ec0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4ed0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
4ee0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
4ef0: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
4f00: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
4f10: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
4f20: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
4f30: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
4f40: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
4f50: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
4f60: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
4f70: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
4f80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
4f90: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
4fa0: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
4fb0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
4fc0: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
4fd0: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
4fe0: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
4ff0: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5000: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5010: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
5020: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
5030: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
5040: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
5050: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
5060: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
5070: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5080: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5090: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
50a0: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
50b0: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
50c0: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
50d0: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
50e0: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
50f0: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5100: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5110: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69  qlite3Malloc( (i
5120: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b  nt)pCur->nKey );
5130: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
5140: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5150: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
5160: 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e  , 0, (int)pCur->
5170: 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20  nKey, pKey);.   
5180: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5190: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
51a0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65  pCur->pKey = pKe
51b0: 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
51c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
51d0: 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20  free(pKey);.    
51e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
51f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5200: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5210: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
5220: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5230: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
5240: 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Key );..  if( rc
5250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5260: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
5270: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
5280: 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  ur);.    pCur->e
5290: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
52a0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
52b0: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
52c0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
52d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
52e0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
52f0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5300: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5310: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5320: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5330: 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72  he table  with r
5340: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
5350: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
5360: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
5370: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
5380: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5390: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
53a0: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
53b0: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
53c0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
53d0: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
53e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
53f0: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
5400: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
5410: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
5420: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5430: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5440: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5450: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
5460: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
5470: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
5480: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
5490: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
54a0: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
54b0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
54c0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
54d0: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  oot) ){.      if
54e0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
54f0: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5500: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
5510: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5520: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
5530: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
5540: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5550: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
5560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5570: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5580: 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  p->iPage>0 );.  
5590: 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
55a0: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
55b0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
55c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
55d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
55e0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
55f0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5600: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
5610: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
5620: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
5630: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
5640: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
5650: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
5660: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
5670: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
5680: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
5690: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
56a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
56b0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
56c0: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
56d0: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
56e0: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
56f0: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
5700: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
5710: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
5720: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
5730: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
5740: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
5750: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
5760: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
5770: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5780: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
5790: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
57a0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
57b0: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
57c0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
57d0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
57e0: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
57f0: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
5800: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
5810: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
5820: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
5830: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
5840: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
5850: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
5860: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
5870: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
5880: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
5890: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
58a0: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
58b0: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
58c0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
58d0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
58f0: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
5900: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
5910: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
5920: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
5930: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
5940: 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20  e[200];         
5950: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
5960: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
5970: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
5980: 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20  /.  char *pFree 
5990: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79  = 0;..  if( pKey
59a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
59b0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
59c0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
59d0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
59e0: 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
59f0: 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43  cord(.        pC
5a00: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53  ur->pKeyInfo, aS
5a10: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
5a20: 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20  ace), &pFree.   
5a30: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
5a40: 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
5a50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
5a70: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
5a80: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
5a90: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
5aa0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
5ab0: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
5ac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5ad0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
5ae0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
5af0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5b00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
5b10: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  KPT;.    }.  }el
5b20: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
5b30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
5b40: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
5b50: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
5b60: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
5b70: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
5b80: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
5b90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
5ba0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
5bb0: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
5bc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5bd0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
5be0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
5bf0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
5c00: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
5c10: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
5c20: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
5c30: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
5c40: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
5c50: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
5c60: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
5c70: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
5c80: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
5c90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
5ca0: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
5cb0: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
5cc0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
5cd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5ce0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
5cf0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
5d00: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
5d10: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
5d20: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5d30: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5d40: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5d50: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
5d60: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5d70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
5d80: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
5d90: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
5da0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5db0: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
5dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5dd0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
5de0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
5df0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
5e00: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
5e10: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
5e20: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
5e30: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
5e40: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
5e50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5e70: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5e80: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5e90: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5ea0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5eb0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ec0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5ed0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
5ee0: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
5ef0: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
5f00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5f10: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
5f20: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5f30: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
5f40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5f50: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5f60: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5f70: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5f80: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5f90: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5fa0: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5fb0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5fc0: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5fd0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5fe0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5ff0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6000: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6010: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6020: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
6030: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
6040: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6050: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6060: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
6070: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6080: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
60a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
60b0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
60c0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
60d0: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
60e0: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
60f0: 73 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  s set as follows
6100: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 20  :.**.**    0:   
6110: 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 6e  The cursor is un
6120: 63 68 61 6e 67 65 64 0a 2a 2a 20 20 20 20 31 3a  changed.**    1:
6130: 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
6140: 20 73 74 69 6c 6c 20 70 6f 69 6e 74 69 6e 67 20   still pointing 
6150: 61 74 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2c  at the same row,
6160: 20 62 75 74 20 74 68 65 20 70 6f 69 6e 74 65 72   but the pointer
6170: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 74  s.**         ret
6180: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
6190: 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 29 20  BtreeKeyFetch() 
61a0: 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  or sqlite3BtreeD
61b0: 61 74 61 46 65 74 63 68 28 29 0a 2a 2a 20 20 20  ataFetch().**   
61c0: 20 20 20 20 20 20 6d 69 67 68 74 20 6e 6f 77 20        might now 
61d0: 62 65 20 69 6e 76 61 6c 69 64 20 62 65 63 61 75  be invalid becau
61e0: 73 65 20 6f 66 20 61 20 62 61 6c 61 6e 63 65 28  se of a balance(
61f0: 29 20 6f 72 20 6f 74 68 65 72 20 63 68 61 6e 67  ) or other chang
6200: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  e to the.**     
6210: 20 20 20 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 20      b-tree..**  
6220: 20 20 32 3a 20 20 20 54 68 65 20 63 75 72 73 6f    2:   The curso
6230: 72 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 70  r is no longer p
6240: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 72  ointing to the r
6250: 6f 77 2e 20 20 54 68 65 20 72 6f 77 20 6d 69 67  ow.  The row mig
6260: 68 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20  ht have.**      
6270: 20 20 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20     been deleted 
6280: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
6290: 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 69 6e  he cursor..*/.in
62a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
62b0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
62c0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
62d0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
62e0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
62f0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6300: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6310: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b   *pHasMoved = 0;
6320: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6330: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
6340: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
6350: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
6360: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
6370: 70 48 61 73 4d 6f 76 65 64 20 3d 20 32 3b 0a 20  pHasMoved = 2;. 
6380: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6390: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
63a0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
63b0: 49 44 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72  ID || NEVER(pCur
63c0: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29  ->skipNext!=0) )
63d0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
63e0: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
63f0: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
6400: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6410: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
6420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6430: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
6440: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
6450: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
6460: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
6470: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
6480: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
6490: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
64a0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
64b0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
64c0: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
64d0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
64e0: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
64f0: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
6500: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
6510: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
6520: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
6530: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
6540: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
6550: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
6560: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
6570: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
6580: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
6590: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
65a0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
65b0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
65c0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
65d0: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
65e0: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
65f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6600: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6610: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
6620: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
6630: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6640: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
6650: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
6660: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
6670: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
6680: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
6690: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
66a0: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
66b0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
66c0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
66d0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
66e0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
66f0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
6700: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
6710: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6720: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
6730: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
6740: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6750: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
6760: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
6770: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
6780: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
6790: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
67a0: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
67b0: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
67c0: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
67d0: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
67e0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
67f0: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
6800: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
6810: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6820: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
6830: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
6840: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6850: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
6860: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6870: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
6880: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
6890: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
68a0: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
68b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
68c0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
68d0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
68e0: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
68f0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
6900: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
6910: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
6920: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
6930: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
6940: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
6950: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6960: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
6970: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
6980: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
6990: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
69a0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
69b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
69c0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
69d0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
69e0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
69f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
6a00: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
6a10: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
6a20: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
6a30: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
6a40: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
6a50: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
6a60: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
6a70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
6a80: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
6a90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6aa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6ab0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
6ac0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
6ad0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6ae0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6af0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6b00: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6b10: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6b20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6b30: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
6b40: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
6b50: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
6b60: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
6b70: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
6b80: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
6b90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6ba0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6bb0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
6bc0: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
6bd0: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6be0: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6bf0: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
6c00: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6c10: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6c20: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6c30: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6c40: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
6c50: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6c60: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
6c70: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
6c80: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
6c90: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
6ca0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6cb0: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
6cc0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6cd0: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6ce0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6cf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6d00: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6d10: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6d20: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6d30: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
6d50: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
6d60: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6d70: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
6d80: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
6d90: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
6da0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6db0: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
6dc0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6dd0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6de0: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6df0: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6e00: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6e10: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6e20: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6e30: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6e40: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6e50: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
6e60: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
6e70: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
6e80: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6e90: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
6ea0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6eb0: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6ec0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6ed0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6ee0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6ef0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6f00: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6f10: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6f20: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6f30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6f40: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6f50: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
6f60: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6f70: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6f80: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
6f90: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
6fa0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6fb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6fc0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6fd0: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6fe0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6ff0: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
7000: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
7010: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
7020: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
7030: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
7040: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7050: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
7060: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
7070: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
7080: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
7090: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
70a0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
70b0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
70c0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
70d0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
70e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
70f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7100: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
7110: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
7120: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
7130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
7140: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
7150: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
7160: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
7170: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
7180: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7190: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
71a0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
71b0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
71c0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
71d0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
71e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
71f0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
7200: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
7210: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
7220: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7230: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
7240: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
7250: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
7260: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
7270: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
7280: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
7290: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
72a0: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
72b0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
72c0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
72d0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
72e0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
72f0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
7300: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
7310: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
7320: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
7330: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
7340: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
7350: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7360: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
7370: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
7380: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
7390: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
73a0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
73b0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
73c0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
73d0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
73e0: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
73f0: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
7400: 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d  e findCellv2(D,M
7410: 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32  ,O,I) (D+(M&get2
7420: 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29  byte(D+(O+2*(I))
7430: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
7440: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
7450: 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43  version of findC
7460: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
7470: 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68   for.** pages th
7480: 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76  at do contain ov
7490: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
74a0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
74b0: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
74c0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
74d0: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
74e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
74f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7500: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
7510: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
7520: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
7530: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
7540: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20   int k;.    k = 
7550: 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d  pPage->aiOvfl[i]
7560: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
7570: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
7580: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
7590: 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
75a0: 2d 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  ->apOvfl[i];.   
75b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
75c0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
75d0: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
75e0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
75f0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
7600: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
7610: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
7620: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
7630: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
7640: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
7650: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
7660: 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43  on.  btreeParseC
7670: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
7680: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
7690: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
76a0: 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72  ent and btreePar
76b0: 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20  seCellPtr() .** 
76c0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
76d0: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
76e0: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
76f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
7700: 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  **.** Within thi
7710: 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73  s file, the pars
7720: 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61  eCell() macro ca
7730: 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  n be called inst
7740: 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50  ead of.** btreeP
7750: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
7760: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
7770: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
7780: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61  e faster..*/.sta
7790: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
77a0: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
77b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
77c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
77d0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
77e0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
77f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7800: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
7810: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
7820: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7830: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7840: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7850: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e  re */.){.  u16 n
7860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7870: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
7880: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
7890: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
78a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
78b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
78c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
78d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
78e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
78f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7900: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7910: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
7920: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
7930: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
7940: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
7950: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
7960: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7970: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
7980: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
7990: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
79a0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
79b0: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
79c0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
79d0: 28 20 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( n==0 );.      
79e0: 6e 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  n = getVarint32(
79f0: 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f 61 64 29  pCell, nPayload)
7a00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7a10: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
7a20: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
7a30: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
7a40: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
7a50: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
7a60: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
7a70: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
7a80: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7a90: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
7aa0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
7ab0: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
7ac0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
7ad0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7ae0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
7af0: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
7b00: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
7b10: 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28  = n;.  testcase(
7b20: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
7b30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
7b40: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
7b50: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
7b60: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c  cal+1 );.  if( l
7b70: 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d  ikely(nPayload<=
7b80: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29  pPage->maxLocal)
7b90: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
7ba0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
7bb0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
7bc0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
7bd0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
7be0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
7bf0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
7c00: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
7c10: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66  */.    if( (pInf
7c20: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
7c30: 28 6e 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20  (n+nPayload))<4 
7c40: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
7c50: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
7c60: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
7c70: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
7c80: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
7c90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7ca0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
7cb0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
7cc0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
7cd0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
7ce0: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
7cf0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
7d00: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
7d10: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
7d20: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
7d30: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7d40: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
7d50: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
7d60: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
7d70: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
7d80: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
7d90: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
7da0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
7db0: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
7dc0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
7dd0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
7de0: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
7df0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
7e00: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
7e10: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
7e20: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
7e30: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
7e40: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
7e50: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
7e60: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
7e70: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
7e80: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
7e90: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7ea0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7eb0: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
7ec0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
7ed0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7ee0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7ef0: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
7f00: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
7f10: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
7f20: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
7f30: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
7f40: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7f50: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
7f60: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7f70: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
7f80: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
7f90: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
7fa0: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
7fb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7fc0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
7fd0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
7fe0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
7ff0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8000: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8010: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
8020: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
8030: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8040: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
8050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8060: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8070: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8080: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
8090: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
80a0: 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  16)(pInfo->nLoca
80b0: 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66  l + n);.    pInf
80c0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
80d0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
80e0: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70  .  }.}.#define p
80f0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
8100: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a  iCell, pInfo) \.
8110: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8120: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
8130: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
8140: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
8150: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  ).static void bt
8160: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
8170: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8180: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8190: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
81a0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
81b0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
81c0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
81d0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
81e0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
81f0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8200: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8210: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8220: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
8230: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
8240: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
8250: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
8260: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
8270: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
8280: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
8290: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
82a0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
82b0: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
82c0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
82d0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
82e0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
82f0: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
8300: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
8310: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
8320: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
8330: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
8340: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
8350: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
8360: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
8370: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
8380: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
8390: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
83a0: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
83b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
83c0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
83d0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
83e0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
83f0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
8400: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
8410: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
8420: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
8430: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
8440: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
8450: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
8460: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
8470: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
8480: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
8490: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
84a0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
84b0: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
84c0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
84d0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
84e0: 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72  info;.  btreePar
84f0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
8500: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
8510: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
8520: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
8530: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
8540: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
8550: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
8560: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8570: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
8580: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
8590: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
85a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
85b0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
85c0: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
85d0: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
85e0: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
85f0: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
8600: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
8610: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
8620: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
8630: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
8640: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
8650: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
8660: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
8670: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8680: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8690: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
86a0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
86b0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
86c0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
86d0: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
86e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
86f0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8700: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8710: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8720: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8730: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
8740: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
8750: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
8760: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8770: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
8780: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
8790: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
87a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
87b0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
87c0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
87d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
87e0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
87f0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8800: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8810: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
8820: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8830: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
8840: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
8850: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
8860: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
8870: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8880: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
8890: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
88a0: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
88b0: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
88c0: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
88d0: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
88e0: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
88f0: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
8900: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
8910: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8920: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
8930: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
8940: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
8950: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
8960: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
8970: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
8980: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
8990: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
89a0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
89b0: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
89c0: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
89d0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
89e0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
89f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8a00: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
8a10: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
8a20: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
8a30: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
8a40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
8a50: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
8a60: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
8a70: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
8a80: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
8a90: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
8aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8ab0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8ac0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8ad0: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
8ae0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
8af0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
8b00: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
8b10: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
8b20: 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
8b30: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
8b40: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
8b50: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
8b60: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
8b70: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
8b80: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
8b90: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
8ba0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
8bb0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
8bc0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
8bd0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
8be0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
8bf0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
8c00: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
8c10: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
8c20: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
8c30: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
8c40: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
8c50: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
8c60: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
8c70: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
8c80: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
8c90: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
8ca0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
8cb0: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
8cc0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
8cd0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
8ce0: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
8cf0: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
8d00: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
8d10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
8d20: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
8d30: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8d40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8d60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
8d70: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
8d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8d90: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
8da0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
8db0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
8dc0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
8dd0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
8de0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
8e10: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
8e20: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
8e30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8e40: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
8e50: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
8e60: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
8e70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8e80: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
8e90: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
8ea0: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8ec0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
8ed0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
8ee0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
8f10: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
8f20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8f30: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
8f40: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
8f50: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8f60: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
8f70: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
8f80: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
8f90: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
8fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8fb0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
8fc0: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
8fd0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
8ff0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
9000: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
9010: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9020: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9030: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9040: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9050: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
9060: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9070: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
9080: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9090: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
90a0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
90b0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
90c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
90d0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
90e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
90f0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
9100: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
9110: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
9120: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
9130: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
9140: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
9150: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
9160: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
9170: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
9180: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
9190: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
91a0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
91b0: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
91c0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
91d0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
91e0: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
91f0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9200: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72  memcpy(&temp[cbr
9210: 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
9220: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62   usableSize - cb
9230: 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  rk);.  cbrk = us
9240: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
9250: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
9260: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
9270: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
9280: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
9290: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
92a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
92b0: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
92c0: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
92d0: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
92e0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
92f0: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
9300: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
9310: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
9320: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
9330: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
9340: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
9350: 20 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   );.#if !defined
9360: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
9370: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
9380: 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65  CK).    /* These
9390: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
93a0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
93b0: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
93c0: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
93d0: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
93e0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
93f0: 43 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64  CHECK is defined
9400: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
9410: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
9420: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
9430: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9440: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9450: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  PT;.    }.#endif
9460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
9470: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
9480: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
9490: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
94a0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
94b0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
94c0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20  rk -= size;.#if 
94d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
94e0: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
94f0: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69  ELL_CHECK).    i
9500: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
9510: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9520: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9530: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9540: 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b  lse.    if( cbrk
9550: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
9560: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
9570: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
9580: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9590: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
95a0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
95b0: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
95c0: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
95d0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
95e0: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
95f0: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
9600: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9610: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
9620: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d  eSize );.    mem
9630: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
9640: 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65   &temp[pc], size
9650: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
9660: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
9670: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
9680: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
9690: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
96a0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
96b0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
96c0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
96d0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
96e0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
96f0: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
9700: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
9710: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
9720: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9730: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9740: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9750: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
9760: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
9770: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
9780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9790: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
97a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
97b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
97c0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
97d0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
97e0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
97f0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
9800: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9810: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
9820: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
9830: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
9840: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
9850: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
9860: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
9870: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
9880: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
9890: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
98a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
98b0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
98c0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
98d0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
98e0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
98f0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
9900: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
9910: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
9920: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
9930: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
9940: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
9950: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
9960: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
9970: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
9980: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
9990: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
99a0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
99b0: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
99c0: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
99d0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
99e0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
99f0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
9a00: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
9a10: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
9a20: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
9a30: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
9a40: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
9a50: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
9a60: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
9a70: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
9a80: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
9a90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9aa0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
9ab0: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
9ac0: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
9ad0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
9ae0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
9af0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
9b00: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
9b10: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
9b40: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
9b50: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
9b60: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
9b70: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9b80: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
9b90: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
9ba0: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
9bb0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
9bc0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
9bd0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9be0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
9bf0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
9c00: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
9c10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9c20: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9c30: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9c40: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
9c50: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
9c60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9c70: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9c80: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9c90: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
9ca0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
9cb0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
9cc0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
9cd0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
9ce0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
9cf0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
9d00: 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ==0 );.  usableS
9d10: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
9d20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
9d30: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20  assert( nByte < 
9d40: 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a  usableSize-8 );.
9d50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9d60: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
9d70: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
9d80: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
9d90: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
9da0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
9db0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
9dc0: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
9dd0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9de0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
9df0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
9e00: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
9e10: 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36  ){.      top = 6
9e20: 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  5536;.    }else{
9e30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9e40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9e50: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
9e60: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65  /* If there is e
9e70: 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77  nough space betw
9e80: 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20  een gap and top 
9e90: 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c  for one more cel
9ea0: 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61  l pointer.  ** a
9eb0: 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65  rray entry offse
9ec0: 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66 72  t, and if the fr
9ed0: 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d  eelist is not em
9ee0: 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68  pty, then search
9ef0: 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69   the.  ** freeli
9f00: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9f10: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9f20: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9f30: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20   the request..  
9f40: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
9f50: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
9f60: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
9f70: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9f80: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20  e( gap==top );. 
9f90: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
9fa0: 26 26 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20  && (data[hdr+1] 
9fb0: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20  || data[hdr+2]) 
9fc0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  ){.    int pc, a
9fd0: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
9fe0: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
9ff0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
a000: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
a010: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
a020: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a030: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
a040: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  e slot */.      
a050: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
a060: 65 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34  e-4 || pc<addr+4
a070: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
a080: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a090: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
a0a0: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
a0b0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
a0c0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ]);.      if( si
a0d0: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
a0e0: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a       int x = siz
a0f0: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
a100: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
a110: 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4 );.        tes
a120: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
a130: 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29         if( x<4 )
a140: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a150: 64 61 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30 20  data[hdr+7]>=60 
a160: 29 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e  ) goto defragmen
a170: 74 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  t_page;.        
a180: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
a190: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
a1a0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
a1b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
a1c0: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
a1d0: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
a1e0: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
a1f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
a200: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
a210: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
a220: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
a230: 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20  7] += (u8)x;.   
a240: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
a250: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
a260: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
a270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a280: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a290: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
a2b0: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
a2c0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
a2d0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
a2e0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
a2f0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
a300: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
a310: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
a320: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
a330: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
a340: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
a350: 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d  .        *pIdx =
a360: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
a370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a380: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
a390: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
a3a0: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
a3b0: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
a3c0: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
a3d0: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
a3e0: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
a3f0: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
a400: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
a410: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
a420: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
a430: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
a440: 74 6f 70 20 29 7b 0a 64 65 66 72 61 67 6d 65 6e  top ){.defragmen
a450: 74 5f 70 61 67 65 3a 0a 20 20 20 20 74 65 73 74  t_page:.    test
a460: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
a470: 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ll==0 );.    rc 
a480: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
a490: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
a4a0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a4b0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
a4c0: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
a4d0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
a4e0: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
a4f0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
a500: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
a510: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
a520: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
a530: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
a540: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
a550: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a560: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
a570: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
a580: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
a590: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
a5a0: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
a5b0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
a5c0: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
a5d0: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
a5e0: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
a5f0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
a600: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
a610: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
a620: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
a630: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
a640: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
a650: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
a660: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a670: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a680: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
a690: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
a6a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a6b0: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
a6c0: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
a6d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a6e0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
a6f0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
a700: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
a710: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
a720: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
a730: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
a740: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
a750: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
a760: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a770: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
a780: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74  ytes..**.** Most
a790: 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68   of the effort h
a7a0: 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  ere is involved 
a7b0: 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a  in coalesing adj
a7c0: 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c  acent.** free bl
a7d0: 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ocks into a sing
a7e0: 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63  le big free bloc
a7f0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
a800: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
a810: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
a820: 53 74 61 72 74 2c 20 69 6e 74 20 69 53 69 7a 65  Start, int iSize
a830: 29 7b 0a 20 20 69 6e 74 20 69 50 74 72 3b 20 20  ){.  int iPtr;  
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 6f  /* Address of po
a860: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 66 72  inter to next fr
a870: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  eeblock */.  int
a880: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
a890: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
a8a0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  ss of the next f
a8b0: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e  reeblock */.  in
a8c0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
a8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
a8e0: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
a8f0: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 69 6e 74   or 100 */.  int
a900: 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
a910: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65          /* Large
a920: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
a930: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
a940: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a950: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
a960: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
a970: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
a980: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a990: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a9a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a9b0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a9c0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a9d0: 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70 50  sert( iStart>=pP
a9e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
a9f0: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
aa00: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
aa10: 28 20 28 69 53 74 61 72 74 20 2b 20 69 53 69 7a  ( (iStart + iSiz
aa20: 65 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  e) <= (int)pPage
aa30: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
aa40: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
aa50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
aa60: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
aa70: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
aa80: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
aa90: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
aaa0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20  size is 4 */..  
aab0: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
aac0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
aad0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
aae0: 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
aaf0: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
ab00: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
ab10: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
ab20: 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70  delete.    ** op
ab30: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
ab40: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  */.    memset(&d
ab50: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ata[iStart], 0, 
ab60: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iSize);.  }..  /
ab70: 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20  * Add the space 
ab80: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69  back into the li
ab90: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65  nked list of fre
aba0: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74  eblocks.  Note t
abb0: 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68  hat.  ** even th
abc0: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
abd0: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
abe0: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
abf0: 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72  Page(),.  ** btr
ac00: 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64  eeInitPage() did
ac10: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
ac20: 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72  lapping cells or
ac30: 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73  .  ** freeblocks
ac40: 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64   that overlapped
ac50: 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f   cells.   Nor do
ac60: 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65  es it detect whe
ac70: 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20  n the.  ** cell 
ac80: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63  content area exc
ac90: 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69  eeds the value i
aca0: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
acb0: 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a  r.  If these.  *
acc0: 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69  * situations ari
acd0: 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  se, then subsequ
ace0: 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61  ent insert opera
acf0: 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72  tions might corr
ad00: 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65  upt.  ** the fre
ad10: 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f  elist.  So we do
ad20: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   need to check f
ad30: 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68  or corruption wh
ad40: 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a  ile scanning.  *
ad50: 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  * the freelist..
ad60: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
ad70: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
ad80: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
ad90: 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  .  iLast = pPage
ada0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
adb0: 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28  e - 4;.  assert(
adc0: 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29   iStart<=iLast )
add0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 69 46 72 65  ;.  while( (iFre
ade0: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
adf0: 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53  &data[iPtr]))<iS
ae00: 74 61 72 74 20 26 26 20 69 46 72 65 65 42 6c 6b  tart && iFreeBlk
ae10: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 46  >0 ){.    if( iF
ae20: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b  reeBlk<iPtr+4 ){
ae30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
ae40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
ae50: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 50 74  T;.    }.    iPt
ae60: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
ae70: 7d 0a 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b  }.  if( iFreeBlk
ae80: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
ae90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
aea0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
aeb0: 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b  assert( iFreeBlk
aec0: 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c  >iPtr || iFreeBl
aed0: 6b 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79  k==0 );.  put2by
aee0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
aef0: 69 53 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62  iStart);.  put2b
af00: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
af10: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
af20: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
af30: 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29  Start+2], iSize)
af40: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
af50: 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20   = pPage->nFree 
af60: 2b 20 28 75 31 36 29 69 53 69 7a 65 3b 0a 0a 20  + (u16)iSize;.. 
af70: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
af80: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
af90: 73 20 2a 2f 0a 20 20 69 50 74 72 20 3d 20 68 64  s */.  iPtr = hd
afa0: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
afb0: 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32  (iFreeBlk = get2
afc0: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
afd0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
afe0: 69 4e 65 78 74 42 6c 6b 3b 20 20 20 20 20 20 2f  iNextBlk;      /
aff0: 2a 20 4e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  * Next freeblock
b000: 20 61 66 74 65 72 20 69 46 72 65 65 42 6c 6b 20   after iFreeBlk 
b010: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 46 72 65  */.    int szFre
b020: 65 42 6c 6b 3b 20 20 20 20 20 2f 2a 20 53 69 7a  eBlk;     /* Siz
b030: 65 20 6f 66 20 69 46 72 65 65 42 6c 6b 20 2a 2f  e of iFreeBlk */
b040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
b050: 65 65 42 6c 6b 3e 69 50 74 72 20 29 3b 0a 20 20  eeBlk>iPtr );.  
b060: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
b070: 6c 6b 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  lk <= (int)pPage
b080: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b090: 65 2d 34 20 29 3b 0a 20 20 20 20 69 4e 65 78 74  e-4 );.    iNext
b0a0: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
b0b0: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
b0c0: 0a 20 20 20 20 73 7a 46 72 65 65 42 6c 6b 20 3d  .    szFreeBlk =
b0d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b0e0: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
b0f0: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 2b    if( iFreeBlk +
b100: 20 73 7a 46 72 65 65 42 6c 6b 20 2b 20 33 20 3e   szFreeBlk + 3 >
b110: 3d 20 69 4e 65 78 74 42 6c 6b 20 26 26 20 69 4e  = iNextBlk && iN
b120: 65 78 74 42 6c 6b 3e 30 20 29 7b 0a 20 20 20 20  extBlk>0 ){.    
b130: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
b140: 20 2f 2a 20 46 72 61 67 6d 65 6e 74 20 62 79 74   /* Fragment byt
b150: 65 73 20 69 6e 20 62 65 74 77 65 65 6e 20 69 46  es in between iF
b160: 72 65 65 42 6c 6b 20 61 6e 64 20 69 4e 65 78 74  reeBlk and iNext
b170: 42 6c 6b 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  Blk */.      int
b180: 20 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   x;         /* T
b190: 65 6d 70 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  emp value */.   
b1a0: 20 20 20 6e 46 72 61 67 20 3d 20 69 4e 65 78 74     nFrag = iNext
b1b0: 42 6c 6b 20 2d 20 28 69 46 72 65 65 42 6c 6b 2b  Blk - (iFreeBlk+
b1c0: 73 7a 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20  szFreeBlk);.    
b1d0: 20 20 69 66 28 20 28 6e 46 72 61 67 3c 30 29 20    if( (nFrag<0) 
b1e0: 7c 7c 20 28 6e 46 72 61 67 3e 28 69 6e 74 29 64  || (nFrag>(int)d
b1f0: 61 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20  ata[hdr+7]) ){. 
b200: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b210: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b220: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
b230: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
b240: 28 75 38 29 6e 46 72 61 67 3b 0a 20 20 20 20 20  (u8)nFrag;.     
b250: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
b260: 61 74 61 5b 69 4e 65 78 74 42 6c 6b 5d 29 3b 0a  ata[iNextBlk]);.
b270: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
b280: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 2c 20  data[iFreeBlk], 
b290: 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 69 4e  x);.      x = iN
b2a0: 65 78 74 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  extBlk + get2byt
b2b0: 65 28 26 64 61 74 61 5b 69 4e 65 78 74 42 6c 6b  e(&data[iNextBlk
b2c0: 2b 32 5d 29 20 2d 20 69 46 72 65 65 42 6c 6b 3b  +2]) - iFreeBlk;
b2d0: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
b2e0: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
b2f0: 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ], x);.    }else
b300: 7b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  {.      iPtr = i
b310: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
b320: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
b330: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
b340: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
b350: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
b360: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
b370: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
b380: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
b390: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
b3a0: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
b3b0: 6f 70 3b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b  op;.    iFreeBlk
b3c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b3d0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
b3e0: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
b3f0: 31 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 42  1], &data[iFreeB
b400: 6c 6b 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70  lk], 2);.    top
b410: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b420: 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32  a[hdr+5]) + get2
b430: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
b440: 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74  Blk+2]);.    put
b450: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b460: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20  5], top);.  }.  
b470: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b480: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
b490: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b4a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
b4b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b4c0: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
b4d0: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
b4e0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
b4f0: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
b500: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
b510: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
b520: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
b530: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
b540: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
b550: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
b560: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
b570: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
b580: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
b590: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
b5a0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
b5b0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
b5c0: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
b5d0: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
b5e0: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
b5f0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
b600: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
b610: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
b620: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
b630: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
b640: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
b650: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
b660: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
b670: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
b680: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
b690: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
b6a0: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
b6b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
b6c0: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
b6d0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
b6e0: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
b6f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b700: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b710: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
b720: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
b730: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
b740: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
b750: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
b760: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
b770: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
b780: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
b790: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74  age->leaf;.  pBt
b7a0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
b7b0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
b7c0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
b7d0: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
b7e0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
b7f0: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
b800: 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d  hasData = pPage-
b810: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
b820: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
b830: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
b840: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
b850: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
b860: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
b870: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
b880: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
b890: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
b8a0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b8b0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   0;.    pPage->m
b8c0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
b8d0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
b8e0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
b8f0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
b900: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
b910: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b920: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
b930: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
b940: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
b950: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
b960: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b970: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
b980: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
b990: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
b9a0: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
b9b0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
b9c0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
b9d0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
b9e0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
b9f0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
ba00: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
ba10: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
ba20: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
ba30: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
ba40: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
ba50: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
ba60: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
ba70: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
ba80: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
ba90: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
baa0: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
bab0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
bac0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
bad0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
bae0: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
baf0: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
bb00: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
bb10: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
bb20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
bb30: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
bb40: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
bb50: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
bb60: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
bb70: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
bb80: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bb90: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
bba0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
bbb0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
bbc0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
bbd0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
bbe0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
bbf0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
bc00: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
bc10: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
bc20: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
bc30: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
bc40: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
bc50: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
bc60: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
bc70: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
bc80: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
bc90: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
bca0: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
bcb0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
bcc0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
bcd0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
bce0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
bcf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
bd00: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
bd10: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
bd20: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
bd30: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
bd40: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
bd50: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
bd60: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
bd70: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
bd80: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
bd90: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
bda0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
bdb0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
bdc0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
bdd0: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
bde0: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
bdf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
be00: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
be10: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
be20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
be30: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
be40: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
be50: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
be60: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
be70: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
be80: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
be90: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
bea0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
beb0: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
bec0: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
bed0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
bee0: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
bef0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  ge->aData;.    i
bf00: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
bf10: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
bf20: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
bf30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bf40: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
bf50: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
bf60: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
bf70: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61  65536 );.    pPa
bf80: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
bf90: 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
bfa0: 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61  ze - 1);.    pPa
bfb0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
bfc0: 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  0;.    usableSiz
bfd0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
bfe0: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
bff0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
c000: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
c010: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
c020: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  af;.    pPage->a
c030: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
c040: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
c050: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
c060: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
c070: 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20  set];.    top = 
c080: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
c090: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
c0a0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
c0b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c0c0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
c0d0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
c0e0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
c0f0: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
c100: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
c110: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
c120: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
c130: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
c140: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c150: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
c160: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
c170: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
c180: 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f  L(pBt) );..    /
c190: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
c1a0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
c1b0: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
c1c0: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
c1d0: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
c1e0: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
c1f0: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
c200: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
c210: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
c220: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
c230: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
c240: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
c250: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
c260: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
c270: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
c280: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
c290: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
c2a0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
c2b0: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
c2c0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
c2d0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
c2e0: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
c2f0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
c300: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
c310: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
c320: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
c330: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
c340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c350: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
c360: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
c370: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
c380: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
c390: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
c3a0: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
c3b0: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
c3c0: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
c3d0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
c3e0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
c3f0: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
c400: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
c410: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
c420: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
c430: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
c440: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
c450: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
c460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
c470: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
c480: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
c490: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
c4a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c4b0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
c4c0: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
c4d0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
c4e0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
c4f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
c500: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
c510: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
c520: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
c530: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
c540: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c550: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
c560: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
c570: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
c580: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
c590: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
c5a0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
c5b0: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
c5c0: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
c5d0: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
c5e0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
c5f0: 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
c600: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
c610: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  p;.    while( pc
c620: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
c630: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
c640: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
c650: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
c660: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
c670: 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20  * Start of free 
c680: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
c690: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
c6a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c6b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
c6d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c6e0: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
c6f0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
c700: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c710: 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26    if( (next>0 &&
c720: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
c730: 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  ) || pc+size>usa
c740: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
c750: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
c760: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
c770: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e  ending order. An
c780: 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  d the last byte 
c790: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
c7a0: 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73  e free-block mus
c7b0: 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74  t lie on the dat
c7c0: 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a  abase page.  */.
c7d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c7e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c7f0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c800: 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65     nFree = nFree
c810: 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70   + size;.      p
c820: 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  c = next;.    }.
c830: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
c840: 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
c850: 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
c860: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c870: 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  he start.    ** 
c880: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
c890: 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68  ent area plus th
c8a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
c8b0: 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20   bytes within.  
c8c0: 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f    ** the cell-co
c8d0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74  ntent area. If t
c8e0: 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74  his is greater t
c8f0: 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73  han the usable-s
c900: 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ize.    ** of th
c910: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
c920: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
c930: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68  rrupted. This ch
c940: 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20  eck also.    ** 
c950: 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79  serves to verify
c960: 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74   that the offset
c970: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
c980: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c990: 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61  t.    ** area, a
c9a0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
c9b0: 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65  page header, lie
c9c0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
c9d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c9e0: 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69  ( nFree>usableSi
c9f0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
ca00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ca10: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
ca20: 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
ca30: 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20  = (u16)(nFree - 
ca40: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20  iCellFirst);.   
ca50: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
ca60: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
ca70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ca80: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61  *.** Set up a ra
ca90: 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69  w page so that i
caa0: 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64  t looks like a d
cab0: 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c  atabase page hol
cac0: 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69  ding.** no entri
cad0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
cae0: 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50  id zeroPage(MemP
caf0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
cb00: 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e  flags){.  unsign
cb10: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
cb20: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
cb30: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
cb40: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
cb50: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
cb60: 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66  rOffset;.  u16 f
cb70: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
cb80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
cb90: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
cba0: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
cbb0: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
cbc0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
cbd0: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
cbe0: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
cbf0: 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
cc00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
cc10: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
cc20: 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20  DbPage) == data 
cc30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
cc40: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
cc50: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
cc60: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
cc70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
cc80: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
cc90: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62   );.  if( pBt->b
cca0: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
ccb0: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
ccc0: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
ccd0: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
cce0: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
ccf0: 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d  .  }.  data[hdr]
cd00: 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a   = (char)flags;.
cd10: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
cd20: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
cd30: 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a  )==0 ? 12 : 8);.
cd40: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
cd50: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
cd60: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
cd70: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
cd80: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
cd90: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
cda0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
cdb0: 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
cdc0: 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64  ze - first);.  d
cdd0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
cde0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
cdf0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
ce00: 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e  first;.  pPage->
ce10: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
ce20: 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
ce30: 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  ];.  pPage->aCel
ce40: 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72  lIdx = &data[fir
ce50: 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  st];.  pPage->nO
ce60: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
ce70: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
ce80: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
ce90: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
cea0: 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
ceb0: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
cec0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
ced0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
cee0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
cef0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
cf00: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
cf10: 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
cf20: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
cf30: 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
cf40: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
cf50: 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
cf60: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
cf70: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
cf80: 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
cf90: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
cfa0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
cfb0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
cfc0: 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
cfd0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
cfe0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
cff0: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
d000: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
d010: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
d020: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
d030: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
d040: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
d050: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
d060: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d070: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
d080: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72  1 ? 100 : 0;.  r
d090: 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
d0a0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
d0b0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
d0c0: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
d0d0: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
d0e0: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
d0f0: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
d100: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
d110: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
d120: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
d130: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
d140: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
d150: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
d160: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
d170: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
d180: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
d190: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
d1a0: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
d1b0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
d1c0: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
d1d0: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
d1e0: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
d1f0: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
d200: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
d210: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
d220: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
d230: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
d240: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
d250: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
d260: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
d270: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
d280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
d290: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
d2a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
d2b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
d2c0: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
d2d0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
d2e0: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
d2f0: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
d300: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
d310: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
d320: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
d330: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
d340: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
d350: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
d360: 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
d370: 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
d380: 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
d390: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
d3a0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
d3b0: 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
d3c0: 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
d3d0: 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
d3e0: 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
d3f0: 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
d400: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d410: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
d420: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
d430: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
d440: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
d450: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
d460: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
d470: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d480: 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
d490: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
d4a0: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
d4b0: 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
d4c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d4d0: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
d4e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
d4f0: 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
d500: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
d510: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
d520: 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
d530: 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
d540: 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
d550: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
d560: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
d570: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
d580: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
d590: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
d5a0: 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
d5b0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
d5c0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
d5d0: 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
d5e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d5f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d600: 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
d610: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
d620: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
d630: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
d640: 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
d650: 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
d660: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
d670: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
d680: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d690: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d6a0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
d6b0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
d6c0: 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
d6d0: 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
d6e0: 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
d6f0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
d700: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
d710: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42  btreePagecount(B
d720: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
d730: 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61   return pBt->nPa
d740: 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65  ge;.}.u32 sqlite
d750: 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42  3BtreeLastPage(B
d760: 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
d770: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
d780: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
d790: 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e  .  assert( ((p->
d7a0: 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30  pBt->nPage)&0x80
d7b0: 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
d7c0: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63  eturn btreePagec
d7d0: 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
d7e0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
d7f0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
d800: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
d810: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
d820: 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63  e is just a.** c
d830: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
d840: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
d850: 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  te calls to btre
d860: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a  eGetPage() and .
d870: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
d880: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
d890: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
d8a0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70  en the value *pp
d8b0: 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69  Page is set to i
d8c0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
d8d0: 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
d8e0: 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
d8f0: 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
d900: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
d910: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
d920: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
d930: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d950: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
d960: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
d970: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
d980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d990: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
d9a0: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
d9b0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
d9c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
d9d0: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
d9e0: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  nter here */.  i
d9f0: 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20 20  nt bReadonly    
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da10: 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  * PAGER_GET_READ
da20: 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a  ONLY or 0 */.){.
da30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
da40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
da50: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
da60: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
da70: 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45 52  bReadonly==PAGER
da80: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c  _GET_READONLY ||
da90: 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b   bReadonly==0 );
daa0: 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
dab0: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
dac0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
dad0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
dae0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
daf0: 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
db00: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
db10: 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b 0a  ge, bReadonly);.
db20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
db30: 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67  TE_OK && (*ppPag
db40: 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
db50: 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
db60: 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
db70: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
db80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
db90: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
dba0: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
dbb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
dbc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
dbd0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
dbe0: 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
dbf0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
dc00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
dc10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
dc20: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
dc30: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
dc40: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
dc50: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
dc60: 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
dc70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
dc80: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
dc90: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
dca0: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73   pPage ){.    as
dcb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
dcc0: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
dcd0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
dce0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
dcf0: 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
dd00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
dd10: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
dd20: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
dd30: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
dd40: 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
dd50: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
dd60: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
dd70: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
dd80: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
dd90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dda0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
ddb0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  >mutex) );.    s
ddc0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
ddd0: 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
dde0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
ddf0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
de00: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
de10: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
de20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
de30: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
de40: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
de50: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
de60: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
de70: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
de80: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
de90: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
dea0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
deb0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dec0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
ded0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
dee0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
def0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
df00: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
df10: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
df20: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
df30: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
df40: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
df50: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
df60: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
df70: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
df80: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
df90: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
dfa0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
dfb0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
dfc0: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
dfd0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
dfe0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
dff0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e000: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
e010: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
e020: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
e030: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
e040: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
e050: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
e060: 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
e070: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
e080: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
e090: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
e0a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
e0b0: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
e0c0: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
e0d0: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
e0e0: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
e0f0: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
e100: 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
e110: 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
e120: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
e130: 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
e140: 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
e150: 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
e160: 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
e170: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
e180: 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
e190: 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
e1a0: 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
e1b0: 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
e1c0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
e1d0: 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
e1e0: 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
e1f0: 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
e200: 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
e210: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
e220: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
e230: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
e240: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
e250: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
e260: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
e270: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
e280: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
e290: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
e2a0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
e2b0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
e2c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e2d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
e2e0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
e2f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e300: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
e310: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
e320: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
e330: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
e340: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
e350: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
e360: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
e370: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
e380: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
e390: 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
e3a0: 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
e3b0: 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
e3c0: 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
e3d0: 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
e3e0: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
e3f0: 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
e400: 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
e410: 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
e420: 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
e430: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
e440: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
e450: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
e460: 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
e470: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
e480: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
e490: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
e4a0: 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
e4b0: 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
e4c0: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
e4d0: 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
e4e0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
e4f0: 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
e500: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
e510: 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
e520: 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
e530: 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
e540: 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
e550: 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
e560: 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
e570: 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
e580: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
e590: 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
e5a0: 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
e5b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e5c0: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
e5d0: 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
e5e0: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
e5f0: 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
e600: 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
e610: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
e620: 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
e630: 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
e640: 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
e650: 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
e660: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e670: 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
e680: 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
e690: 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
e6a0: 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
e6b0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
e6c0: 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
e6d0: 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
e6e0: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
e6f0: 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
e700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
e710: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
e720: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
e730: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
e740: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
e750: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
e760: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
e770: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
e780: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
e790: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
e7a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
e7b0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
e7c0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
e7d0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e7f0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
e800: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
e810: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
e820: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
e830: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
e840: 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
e850: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
e860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
e870: 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
e880: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
e890: 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
e8c0: 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
e8d0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
e8e0: 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
e8f0: 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
e900: 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
e910: 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
e920: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
e930: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
e940: 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
e950: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
e960: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e980: 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
e990: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
e9a0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
e9b0: 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
e9c0: 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
e9d0: 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
e9e0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
e9f0: 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
ea00: 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
ea10: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
ea20: 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
ea30: 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
ea40: 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
ea50: 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
ea60: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
ea70: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
ea80: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
ea90: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
eaa0: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
eab0: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
eac0: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
ead0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
eae0: 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
eaf0: 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
eb00: 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
eb10: 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
eb20: 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
eb30: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
eb40: 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
eb60: 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
eb70: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
eb80: 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
eba0: 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
ebb0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
ebc0: 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
ebd0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
ebe0: 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
ebf0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ec00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ec10: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
ec20: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
ec30: 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
ec40: 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
ec50: 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
ec60: 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
ec70: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
ec80: 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
ec90: 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
eca0: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
ecb0: 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
ecc0: 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
ecd0: 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
ece0: 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
ecf0: 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
ed00: 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
ed10: 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
ed20: 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
ed30: 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
ed40: 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
ed50: 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
ed60: 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
ed70: 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
ed80: 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
ed90: 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
eda0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
edb0: 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
edc0: 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
edd0: 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
ede0: 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
edf0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
ee00: 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
ee10: 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
ee20: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
ee30: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
ee40: 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
ee50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ee60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
ee70: 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
ee80: 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
ee90: 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
eea0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
eeb0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
eec0: 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
eed0: 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
eee0: 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
eef0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
ef00: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ef10: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
ef20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
ef30: 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
ef40: 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
ef50: 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
ef60: 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
ef70: 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
ef80: 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
ef90: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
efa0: 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
efb0: 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
efc0: 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
efd0: 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
efe0: 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
eff0: 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
f000: 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
f010: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
f020: 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
f030: 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
f040: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
f050: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
f060: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
f070: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
f080: 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  loc(nFullPathnam
f090: 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  e);.      MUTEX_
f0a0: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
f0b0: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
f0c0: 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73 68  d; ).      p->sh
f0d0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
f0e0: 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
f0f0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
f100: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
f110: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f120: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f130: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f140: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
f150: 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50     memcpy(zFullP
f160: 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  athname, zFilena
f170: 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  me, sqlite3Strle
f180: 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
f190: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f1a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f1b0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
f1c0: 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
f1d0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f0: 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68         nFullPath
f200: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
f210: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
f220: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
f230: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f240: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f250: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f260: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
f270: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f280: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f290: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
f2a0: 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74  ADSAFE.      mut
f2b0: 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
f2c0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f2d0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
f2e0: 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
f2f0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f300: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
f310: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
f320: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
f330: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
f340: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
f350: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f360: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
f370: 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ared);.#endif.  
f380: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
f390: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
f3a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
f3b0: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
f3c0: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
f3d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
f3e0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
f3f0: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
f400: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
f410: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
f420: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
f430: 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  , 0)).          
f440: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
f450: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
f460: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
f470: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
f480: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
f490: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
f4a0: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
f4c0: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
f4d0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
f4e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
f4f0: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
f500: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
f510: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
f520: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f530: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
f540: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
f550: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f560: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
f570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f580: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
f590: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f5b0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
f5c0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
f5d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
f5e0: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
f5f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
f600: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
f610: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
f620: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
f630: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f640: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
f660: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
f670: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
f680: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
f690: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
f6a0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
f6b0: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
f6c0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
f6d0: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
f6e0: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
f6f0: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
f700: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
f710: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
f720: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
f730: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
f740: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
f750: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
f760: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
f770: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
f780: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
f790: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
f7a0: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
f7b0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
f7c0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
f7d0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
f7e0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
f7f0: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
f800: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
f810: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
f820: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
f830: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
f840: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
f850: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
f860: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
f870: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
f880: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
f890: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
f8a0: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
f8b0: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
f8c0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
f8d0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
f8e0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
f8f0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
f900: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
f910: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
f920: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
f930: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
f940: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
f950: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
f960: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
f970: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
f980: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
f990: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
f9a0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
f9b0: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
f9c0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
f9d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
f9e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
f9f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
fa00: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
fa10: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
fa20: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
fa30: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
fa40: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
fa70: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
fa80: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
fa90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
faa0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
fab0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
fac0: 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
fad0: 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
fae0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
faf0: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
fb00: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
fb10: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
fb20: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
fb30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
fb40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fb50: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
fb60: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
fb70: 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
fb80: 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
fb90: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
fba0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
fbb0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
fbc0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
fbd0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
fbe0: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
fbf0: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
fc00: 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
fc10: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
fc20: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
fc30: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
fc40: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
fc50: 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
fc60: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
fc70: 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
fc80: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
fc90: 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
fca0: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
fcb0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
fcc0: 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70  endif.    pBt->p
fcd0: 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
fce0: 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
fcf0: 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
fd00: 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
fd10: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
fd20: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
fd30: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
fd40: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
fd50: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
fd60: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
fd70: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
fd80: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
fd90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fda0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
fdb0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
fdc0: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
fdd0: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
fde0: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
fdf0: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
fe00: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
fe10: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
fe20: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
fe30: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
fe40: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
fe50: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
fe60: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
fe70: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
fe80: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
fe90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
fea0: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
feb0: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
fec0: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
fed0: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
fee0: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
fef0: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
ff00: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
ff10: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
ff20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ff30: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
ff40: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
ff50: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
ff60: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
ff70: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
ff80: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
ff90: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
ffa0: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
ffb0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
ffc0: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
ffd0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ffe0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
fff0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10000 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
10010 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
10020 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
10030 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
10040 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
10050 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10060 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
10070 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
10080 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
10090 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
100a0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
100b0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
100c0 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
100d0 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
100e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
100f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10100 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
10110 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
10120 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
10130 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
10140 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
10150 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
10160 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
10170 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
10180 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
10190 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
101a0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
101b0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
101c0 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
101d0 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
101e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
101f0 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
10200 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10210 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
10220 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
10230 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10240 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
10250 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
10260 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
10270 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
10280 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
10290 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
102a0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
102b0 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74  red; ).      pBt
102c0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
102d0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
102e0 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
102f0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
10300 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
10310 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
10320 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
10330 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
10340 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
10350 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
10360 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
10370 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
10380 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
10390 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
103a0 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
103b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
103c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
103d0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
103e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
103f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
10400 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
10410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10420 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10430 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
10440 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
10450 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
10460 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10470 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10480 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
10490 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
104a0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
104b0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
104c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
104d0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
104e0 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
104f0 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
10500 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10510 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
10520 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
10530 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
10540 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
10550 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
10560 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
10570 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
10580 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
10590 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
105a0 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
105b0 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
105c0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
105d0 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
105e0 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
105f0 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
10600 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
10610 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
10620 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
10630 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
10640 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
10650 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
10660 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
10670 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
10680 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
10690 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
106a0 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
106b0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
106c0 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
106d0 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
106e0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
106f0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
10700 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
10710 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
10720 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
10730 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
10740 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
10750 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
10760 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
10770 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
10780 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
10790 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
107a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
107b0 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
107c0 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
107d0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
107e0 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
107f0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
10800 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
10810 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
10820 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
10830 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
10840 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
10850 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
10860 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
10870 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
10880 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
10890 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
108a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
108b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
108c0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
108d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
108e0 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
108f0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
10900 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10910 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10920 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
10930 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
10940 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
10950 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
10960 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
10970 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
10980 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
10990 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
109a0 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
109b0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
109c0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
109d0 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
109e0 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
109f0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
10a00 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
10a10 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
10a20 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
10a30 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
10a40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
10a50 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
10a60 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
10a70 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
10a80 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
10a90 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
10aa0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
10ab0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10ac0 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
10ad0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
10ae0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
10af0 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
10b00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10b10 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
10b20 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
10b30 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
10b40 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
10b50 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
10b60 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
10b70 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
10b80 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
10b90 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
10ba0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
10bb0 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
10bc0 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
10bd0 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
10be0 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
10bf0 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
10c00 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
10c10 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
10c20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10c30 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
10c40 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
10c50 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
10c60 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
10c70 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
10c80 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
10c90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10ca0 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
10cb0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10cc0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
10cd0 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
10ce0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
10cf0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
10d00 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
10d10 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
10d20 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
10d30 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
10d40 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
10d50 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
10d60 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10d70 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
10d80 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
10d90 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10da0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10db0 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
10dc0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
10dd0 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
10de0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10df0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10e00 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
10e10 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
10e20 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
10e30 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
10e40 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
10e50 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
10e60 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
10e70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
10e80 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
10e90 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
10ea0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10eb0 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
10ec0 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
10ed0 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
10ee0 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
10ef0 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
10f00 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
10f10 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
10f20 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
10f30 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
10f40 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
10f50 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
10f60 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
10f70 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
10f80 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
10f90 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
10fa0 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
10fb0 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
10fc0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
10fd0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10fe0 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
10ff0 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
11000 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
11010 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
11020 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
11030 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  .    /* One of t
11040 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e  he uses of pBt->
11050 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20  pTmpSpace is to 
11060 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66  format cells bef
11070 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ore.    ** inser
11080 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61  ting them into a
11090 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63   leaf page (func
110a0 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  tion fillInCell(
110b0 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20  )). If.    ** a 
110c0 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61  cell is less tha
110d0 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 4 bytes in siz
110e0 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64  e, it is rounded
110f0 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20   up to 4 bytes. 
11100 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72     ** by the var
11110 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68  ious routines th
11120 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69  at manipulate bi
11130 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63  nary cells. Whic
11140 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61  h.    ** can mea
11150 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c  n that fillInCel
11160 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c  l() only initial
11170 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32  izes the first 2
11180 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74   or 3.    ** byt
11190 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c  es of pTmpSpace,
111a0 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69   but that the fi
111b0 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20  rst 4 bytes are 
111c0 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20  copied from.    
111d0 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74  ** it into a dat
111e0 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73  abase page. This
111f0 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
11200 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20   a problem, but 
11210 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63  it.    ** does c
11220 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20  ause a valgrind 
11230 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31  error when the 1
11240 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75   or 2 bytes of u
11250 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20  nitialized .    
11260 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65  ** data is passe
11270 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c  d to system call
11280 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20   write(). So to 
11290 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72  avoid this error
112a0 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68  ,.    ** zero th
112b0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
112c0 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65  of temp space he
112d0 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  re.  */.    if( 
112e0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
112f0 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
11300 70 53 70 61 63 65 2c 20 30 2c 20 34 29 3b 0a 20  pSpace, 0, 4);. 
11310 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
11320 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
11330 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
11340 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
11350 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
11360 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
11370 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
11380 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
11390 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
113a0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
113b0 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
113c0 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
113d0 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
113e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
113f0 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
11400 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
11410 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11420 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
11430 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
11440 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
11450 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
11460 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11470 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11480 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
11490 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
114a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
114b0 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
114c0 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
114d0 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
114e0 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
114f0 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
11500 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
11510 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
11520 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
11530 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
11540 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
11550 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
11560 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
11570 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
11580 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
11590 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
115a0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
115b0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
115c0 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
115d0 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
115e0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
115f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
11600 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c  eRollback(p, SQL
11610 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
11620 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11630 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
11640 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
11650 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
11660 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
11670 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
11680 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
11690 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
116a0 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
116b0 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
116c0 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
116d0 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
116e0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
116f0 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
11700 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
11710 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
11720 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
11730 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
11740 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
11750 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
11760 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
11770 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
11780 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
11790 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
117a0 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
117b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
117c0 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
117d0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
117e0 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
117f0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
11800 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
11810 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
11820 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
11830 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
11840 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
11850 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
11860 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
11870 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
11880 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11890 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
118a0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
118b0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
118c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
118d0 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
118e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
118f0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
11900 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
11910 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
11920 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
11930 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
11940 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
11950 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
11960 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
11970 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
11980 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
11990 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
119a0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
119b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
119c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
119d0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
119e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
119f0 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
11a00 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cache..**.** The
11a10 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
11a20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69  of cache pages i
11a30 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73  s set to the abs
11a40 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  olute.** value o
11a50 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78  f mxPage.  If mx
11a60 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
11a70 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  , the pager will
11a80 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e  .** operate asyn
11a90 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20  chronously - it 
11aa0 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f  will not stop to
11ab0 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20   do fsync()s.** 
11ac0 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69  to insure data i
11ad0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
11ae0 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
11af0 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69  fore.** continui
11b00 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e  ng.  Transaction
11b10 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  s still work if 
11b20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
11b30 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ff,.** and the d
11b40 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
11b50 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74  e corrupted if t
11b60 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63  his program.** c
11b70 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20  rashes.  But if 
11b80 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
11b90 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
11ba0 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61  there is.** an a
11bb0 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c  brupt power fail
11bc0 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f  ure when synchro
11bd0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65  nous is off, the
11be0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75   database.** cou
11bf0 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ld be left in an
11c00 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
11c10 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20  d unrecoverable 
11c20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72  state..** Synchr
11c30 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64  onous is on by d
11c40 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61  efault so databa
11c50 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
11c60 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79   not.** normally
11c70 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74   a worry..*/.int
11c80 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11c90 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
11ca0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
11cb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11cc0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11cd0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11ce0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
11cf0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
11d00 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11d10 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
11d20 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
11d30 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
11d40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11d50 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11d60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11d70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
11d80 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
11d90 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
11da0 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
11db0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11dc0 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
11dd0 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
11de0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
11df0 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
11e00 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
11e10 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
11e20 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
11e30 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11e40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11e50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
11e60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
11e70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11e80 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
11e90 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
11ea0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
11eb0 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
11ec0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11ee0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11ef0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
11f00 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
11f10 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
11f20 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
11f30 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
11f40 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
11f50 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
11f60 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
11f70 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
11f80 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
11f90 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
11fa0 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
11fb0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
11fc0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
11fd0 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
11fe0 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
11ff0 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
12000 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
12010 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
12020 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
12030 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
12040 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
12050 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
12060 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
12070 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
12080 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
12090 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
120a0 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
120b0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
120c0 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
120d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
120e0 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
120f0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
12100 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
12110 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12120 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
12130 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
12140 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
12150 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
12160 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
12170 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
12180 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
12190 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
121a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
121b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
121c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
121d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
121e0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
121f0 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
12200 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
12210 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12220 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12240 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
12250 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
12260 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
12270 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
12280 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
12290 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
122a0 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
122b0 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
122c0 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
122d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
122e0 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
122f0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
12300 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12310 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
12320 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12330 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
12340 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
12350 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12360 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
12370 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
12380 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
12390 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
123a0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
123b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
123c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
123d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
123e0 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
123f0 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
12400 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
12410 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
12420 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
12430 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
12440 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
12450 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
12460 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
12470 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
12480 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
12490 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
124a0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
124b0 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
124c0 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
124d0 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
124e0 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
124f0 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
12500 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
12510 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
12520 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
12530 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
12540 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
12550 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
12560 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
12570 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
12580 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
12590 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
125a0 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
125b0 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
125c0 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
125d0 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
125e0 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
125f0 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
12600 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
12610 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
12620 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
12630 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
12640 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
12650 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12660 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
12670 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
12680 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
12690 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
126a0 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
126b0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
126c0 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
126d0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
126e0 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
126f0 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
12700 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
12710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12720 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
12730 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
12740 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
12750 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
12760 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12770 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
12780 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
12790 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
127a0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
127b0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
127c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
127d0 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  p);.  if( pBt->b
127e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
127f0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
12800 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12810 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
12820 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
12830 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
12840 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
12850 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
12860 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
12870 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
12880 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
12890 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
128a0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
128b0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
128c0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
128d0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
128e0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
128f0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
12900 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
12910 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
12920 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
12930 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
12940 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
12950 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
12960 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
12970 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
12980 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
12990 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
129a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
129b0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
129c0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
129d0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
129e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
129f0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
12a00 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
12a10 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
12a20 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
12a30 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
12a40 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
12a50 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12a60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12a70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
12a80 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
12a90 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
12aa0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
12ab0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
12ac0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
12ad0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
12ae0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
12af0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c  ITE_HAS_CODEC) |
12b00 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
12b10 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68  _DEBUG)./*.** Th
12b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
12b30 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
12b40 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
12b50 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
12b60 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
12b70 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
12b80 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
12b90 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
12ba0 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
12bb0 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
12bc0 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
12bd0 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
12be0 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
12bf0 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
12c00 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
12c10 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
12c20 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
12c30 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
12c40 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
12c50 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
12c60 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
12c70 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
12c80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12c90 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
12ca0 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
12cb0 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
12cc0 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
12cd0 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion on the.** d
12ce0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
12cf0 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75  hat owns *p, cau
12d00 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
12d10 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
12d20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
12d30 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
12d40 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
12d50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12d60 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
12d70 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
12d80 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
12d90 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
12da0 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  leSize;.}.#endif
12db0 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f 43   /* SQLITE_HAS_C
12dc0 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f 44  ODEC || SQLITE_D
12dd0 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64 65  EBUG */..#if !de
12de0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12df0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
12e00 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
12e10 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
12e20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12e30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
12e40 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
12e50 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
12e60 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
12e70 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
12e80 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
12e90 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
12ea0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
12eb0 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
12ec0 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
12ed0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12ee0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
12ef0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
12f00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12f10 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
12f20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
12f30 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
12f40 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
12f50 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12f60 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
12f70 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
12f80 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
12f90 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
12fa0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
12fb0 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
12fc0 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
12fd0 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
12fe0 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
12ff0 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
13000 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
13010 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
13020 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
13030 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13040 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
13050 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
13060 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
13070 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13080 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
13090 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
130a0 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
130b0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
130c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
130d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
130e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
130f0 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
13100 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ETE flag if newF
13110 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
13120 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
13130 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
13140 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
13150 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
13160 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53  lue of the BTS_S
13170 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  ECURE_DELETE.** 
13180 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
13190 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
131a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
131b0 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
131c0 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
131d0 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
131e0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
131f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13200 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
13210 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
13220 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
13230 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52  gs &= ~BTS_SECUR
13240 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66  E_DELETE;.    if
13250 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70  ( newFlag ) p->p
13260 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13270 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
13280 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70  E;.  } .  b = (p
13290 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
132a0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
132b0 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  ETE)!=0;.  sqlit
132c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
132d0 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23  .  return b;.}.#
132e0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
132f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
13300 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
13310 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13320 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
13330 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
13340 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
13350 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
13360 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
13370 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
13380 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
13390 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
133a0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
133b0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
133c0 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
133d0 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
133e0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
133f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
13400 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
13410 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
13420 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
13430 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
13440 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13450 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
13460 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
13470 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
13480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13490 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
134a0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
134b0 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
134c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
134d0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
134e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
134f0 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
13500 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
13510 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
13520 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
13530 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
13540 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
13550 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
13560 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
13570 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
13580 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
13590 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
135a0 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
135b0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
135c0 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
135d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
135e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
135f0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
13600 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
13610 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
13620 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
13630 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
13640 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
13650 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
13660 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
13670 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13680 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
13690 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
136a0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
136b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
136c0 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
136d0 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
136e0 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
136f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13700 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
13710 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
13720 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
13730 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
13740 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
13750 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
13760 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
13770 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
13780 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
13790 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
137a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
137b0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
137c0 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
137d0 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
137e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
137f0 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
13800 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
13810 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
13820 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
13830 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
13840 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
13850 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
13860 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
13870 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
13880 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
13890 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
138a0 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
138b0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
138c0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
138d0 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
138e0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
138f0 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
13900 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
13910 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
13920 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
13930 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
13940 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
13950 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
13960 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
13970 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
13980 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50  pPage1;     /* P
13990 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
139a0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
139b0 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
139c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
139d0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
139e0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
139f0 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20   nPageFile = 0; 
13a00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
13a10 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
13a20 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
13a30 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20  nt nPageHeader; 
13a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13a50 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
13a60 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
13a70 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73   to hdr */..  as
13a80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13a90 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
13aa0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
13ab0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
13ac0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13ad0 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
13ae0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
13af0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13b00 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
13b10 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  .  rc = btreeGet
13b20 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
13b30 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
13b40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
13b50 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
13b60 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
13b70 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
13b80 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
13b90 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
13ba0 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
13bb0 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
13bc0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48    nPage = nPageH
13bd0 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65  eader = get4byte
13be0 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
13bf0 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  >aData);.  sqlit
13c00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
13c10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
13c20 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
13c30 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
13c40 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
13c50 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
13c60 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
13c70 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
13c80 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
13c90 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
13ca0 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61  >0 ){.    u32 pa
13cb0 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20  geSize;.    u32 
13cc0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
13cd0 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
13ce0 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
13cf0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
13d00 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
13d10 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
13d20 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
13d30 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
13d40 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
13d50 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
13d60 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
13d70 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
13d80 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
13d90 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
13da0 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
13db0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13dc0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
13dd0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13de0 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
13df0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13e00 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
13e10 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
13e20 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
13e30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
13e40 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
13e50 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13e60 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
13e70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
13e80 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
13e90 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
13ea0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
13eb0 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
13ec0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
13ed0 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
13ee0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
13ef0 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
13f00 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
13f10 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
13f20 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
13f30 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
13f40 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
13f50 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
13f60 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
13f70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
13f80 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
13f90 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
13fa0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
13fb0 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
13fc0 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
13fd0 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
13fe0 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
13ff0 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
14000 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
14010 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
14020 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
14030 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
14040 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74  1[19]==2 && (pBt
14050 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
14060 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20  _NO_WAL)==0 ){. 
14070 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
14080 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
14090 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
140a0 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
140b0 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
140c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
140d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
140e0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
140f0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
14100 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20  e if( isOpen==0 
14110 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
14120 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
14130 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
14150 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
14160 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
14170 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
14180 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
14190 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
141a0 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
141b0 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
141c0 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
141d0 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
141e0 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
141f0 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
14200 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
14210 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
14220 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
14230 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
14240 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
14250 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
14260 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
14270 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
14280 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
14290 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
142a0 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
142b0 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
142c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
142d0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
142e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
142f0 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
14300 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
14310 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
14320 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
14330 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
14340 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
14350 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14360 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
14370 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
14380 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
14390 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
143a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
143b0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
143c0 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
143d0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
143e0 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
143f0 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
14400 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
14410 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
14420 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
14430 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
14440 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
14450 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
14460 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
14470 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
14480 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
14490 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
144a0 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
144b0 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
144c0 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
144d0 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
144e0 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
144f0 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
14500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
14510 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
14520 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
14530 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
14540 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
14550 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
14560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
14570 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
14580 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
14590 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
145a0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
145b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
145c0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
145d0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
145e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
145f0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
14600 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
14610 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
14620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
14650 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
14660 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14670 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
14680 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
14690 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
146a0 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
146b0 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
146c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
146d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
146e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
146f0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
14700 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
14710 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
14720 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
14730 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
14740 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
14750 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
14760 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
14770 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
14780 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14790 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
147a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
147b0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
147c0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
147d0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
147e0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
147f0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
14800 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
14810 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
14820 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
14830 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
14840 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
14850 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
14860 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
14870 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
14880 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
14890 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
148a0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
148b0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
148c0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
148d0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
148e0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
148f0 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
14900 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
14910 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
14920 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
14930 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
14940 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
14950 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
14960 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
14970 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
14980 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
14990 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
149a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
149b0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
149c0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
149d0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
149e0 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
149f0 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
14a00 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
14a10 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
14a20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
14a30 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
14a40 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
14a50 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
14a60 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
14a70 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
14a80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
14a90 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
14aa0 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
14ab0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
14ac0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
14ad0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
14ae0 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
14af0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
14b00 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
14b10 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
14b20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
14b30 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
14b40 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
14b50 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
14b60 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
14b70 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
14b80 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
14b90 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
14ba0 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
14bb0 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
14bc0 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
14bd0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
14be0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
14bf0 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
14c00 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
14c10 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
14c20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
14c30 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14c40 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
14c50 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
14c60 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
14c70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
14c80 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
14c90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
14ca0 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
14cb0 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
14cc0 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
14cd0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
14ce0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
14cf0 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
14d00 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
14d10 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
14d20 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
14d30 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
14d40 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
14d50 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
14d60 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
14d70 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
14d80 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
14d90 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
14da0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
14db0 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
14dc0 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
14dd0 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
14de0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
14df0 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
14e00 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
14e10 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
14e20 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
14e30 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
14e40 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
14e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
14e60 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
14e70 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
14e80 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
14e90 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
14ea0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
14eb0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
14ec0 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
14ed0 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
14ee0 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
14ef0 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
14f00 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
14f10 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
14f20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
14f30 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
14f40 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
14f50 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
14f60 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
14f70 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
14f80 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
14f90 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
14fa0 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
14fb0 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
14fc0 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
14fd0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14fe0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
14ff0 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
15000 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
15010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15020 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
15030 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
15040 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
15050 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
15060 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
15070 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
15080 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
15090 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
150a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
150b0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
150c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
150d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
150e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
150f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
15100 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
15110 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
15120 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
15130 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
15140 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
15150 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
15160 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
15170 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
15180 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
15190 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
151a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
151b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
151c0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
151d0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
151e0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
151f0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c  aData );.    rel
15200 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
15210 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
15220 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
15230 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
15240 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
15250 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
15260 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
15270 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
15280 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
15290 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
152a0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
152b0 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
152c0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
152d0 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
152e0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
152f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
15300 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15310 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
15320 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15330 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
15340 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
15350 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
15360 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
15380 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
15390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
153a0 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
153b0 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
153c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
153d0 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
153e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
153f0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
15400 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
15410 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
15420 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
15430 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
15440 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
15450 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
15460 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
15470 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
15480 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
15490 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
154a0 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
154b0 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
154c0 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
154d0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
154e0 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
154f0 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
15500 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
15510 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
15520 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
15530 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
15540 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
15550 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
15560 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
15570 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
15580 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
15590 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
155a0 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
155b0 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
155c0 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
155d0 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
155e0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
155f0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
15600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15610 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
15620 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
15630 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
15640 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
15650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
15660 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
15670 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
15680 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
15690 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
156a0 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
156b0 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
156c0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
156d0 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
156e0 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
156f0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
15700 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
15710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15720 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
15730 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
15740 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
15750 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
15760 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
15770 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
15780 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
15790 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
157a0 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
157b0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
157c0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
157d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
157e0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
157f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15800 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
15810 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
15820 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15830 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
15840 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
15850 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
15860 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
15870 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15890 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
158a0 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
158b0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
158c0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
158d0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
158e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
158f0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
15900 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
15910 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
15920 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
15930 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
15940 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
15950 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
15960 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
15970 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
15980 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
15990 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
159a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
159b0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
159c0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
159d0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
159e0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
159f0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
15a00 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
15a10 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
15a20 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
15a30 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
15a40 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
15a50 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
15a60 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
15a70 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
15a80 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
15a90 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
15aa0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
15ab0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
15ac0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
15ad0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
15ae0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
15af0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
15b00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
15b10 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
15b20 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
15b30 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
15b40 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
15b50 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
15b60 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
15b70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
15b80 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
15b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
15ba0 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
15bb0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
15bc0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
15bd0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
15be0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
15bf0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
15c00 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
15c10 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
15c20 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
15c30 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
15c40 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
15c50 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
15c60 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
15c70 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
15c80 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
15c90 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
15ca0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
15cb0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
15cc0 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
15cd0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
15ce0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
15cf0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
15d00 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
15d10 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
15d20 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
15d30 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
15d40 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
15d50 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
15d60 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
15d70 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
15d80 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
15d90 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
15da0 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
15db0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
15dc0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
15dd0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
15de0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
15df0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
15e00 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
15e10 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
15e20 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
15e30 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
15e40 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
15e50 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
15e60 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
15e70 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
15e80 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
15e90 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
15ea0 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
15eb0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
15ec0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
15ed0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
15ee0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
15ef0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
15f00 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
15f10 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
15f20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15f30 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
15f40 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
15f50 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
15f60 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
15f70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15f80 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
15f90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
15fa0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15fb0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
15fc0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
15fd0 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
15fe0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
15ff0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
16000 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
16010 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
16020 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
16030 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
16040 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
16050 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
16060 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
16070 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
16080 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
16090 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
160a0 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
160b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
160c0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
160d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
160e0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
160f0 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
16100 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
16110 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
16120 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
16130 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
16140 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
16150 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
16160 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
16170 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16180 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
16190 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
161a0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
161b0 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
161c0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
161d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
161e0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
161f0 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
16200 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
16210 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
16220 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
16230 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
16240 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
16250 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
16260 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
16270 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
16280 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
16290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
162a0 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
162b0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
162c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
162d0 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c  RANS_WRITE).   |
162e0 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
162f0 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
16300 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f  =0.  ){.    pBlo
16310 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
16320 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69  r->db;.  }else i
16330 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
16340 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
16350 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
16360 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
16370 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
16380 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
16390 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
163a0 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =p ){.        pB
163b0 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
163c0 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
163d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
163e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
163f0 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73   pBlock ){.    s
16400 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
16410 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
16420 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  Block);.    rc =
16430 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
16440 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
16450 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
16460 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
16470 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
16480 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
16490 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
164a0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
164b0 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
164c0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
164d0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
164e0 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
164f0 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
16500 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
16510 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
16520 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
16530 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
16540 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
16550 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
16560 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
16570 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
16580 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
16590 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
165a0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
165b0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
165c0 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
165d0 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
165e0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
165f0 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
16600 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
16610 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
16620 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
16630 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
16640 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
16650 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
16660 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
16670 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
16680 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
16690 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
166a0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
166b0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
166c0 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
166d0 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
166e0 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
166f0 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
16700 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
16710 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
16720 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
16730 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
16740 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
16750 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
16760 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
16770 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
16780 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
16790 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
167a0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
167b0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
167c0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
167d0 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
167e0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
167f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
16800 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
16810 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
16820 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
16830 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
16840 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
16850 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
16860 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
16870 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
16880 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
16890 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
168a0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
168b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
168c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
168d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
168e0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
168f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16900 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
16910 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16920 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
16930 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
16940 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
16950 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
16960 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
16970 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
16980 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
16990 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
169a0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
169b0 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
169c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
169d0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
169e0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
169f0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
16a00 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
16a10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16a20 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16a30 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
16a40 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
16a50 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
16a60 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
16a70 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
16a80 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
16a90 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
16aa0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
16ab0 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
16ac0 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
16ad0 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
16ae0 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
16af0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
16b00 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
16b10 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
16b20 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
16b30 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
16b40 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
16b50 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
16b60 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
16b70 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
16b80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
16b90 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
16ba0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
16bb0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
16bc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16bd0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
16be0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
16bf0 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
16c00 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
16c10 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
16c20 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
16c30 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
16c40 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
16c50 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
16c60 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
16c70 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
16c80 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
16c90 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
16ca0 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
16cb0 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
16cc0 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
16cd0 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
16ce0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
16cf0 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
16d00 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
16d10 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
16d20 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
16d30 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
16d40 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
16d50 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
16d60 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
16d70 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
16d80 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
16d90 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
16da0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
16db0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
16dc0 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
16dd0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
16de0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
16df0 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
16e00 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
16e10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
16e20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16e30 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
16e40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
16e50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
16e70 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
16e80 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
16e90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
16ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16eb0 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
16ec0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
16ed0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
16ee0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
16ef0 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
16f00 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
16f10 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
16f20 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
16f30 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
16f40 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
16f50 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
16f60 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
16f70 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
16f80 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
16f90 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
16fa0 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
16fb0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
16fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16fd0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
16fe0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
16ff0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
17000 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
17010 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
17020 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17030 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17040 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
17050 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17060 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
17070 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
17080 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
17090 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
170a0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
170b0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
170c0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
170d0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
170e0 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
170f0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
17100 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
17110 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
17120 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
17130 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
17140 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
17150 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17170 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
17180 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
17190 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
171c0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
171d0 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
171e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17200 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
17210 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
17220 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
17230 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
17240 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
17250 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
17260 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
17270 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17280 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
17290 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
172a0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
172b0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
172c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
172d0 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
172e0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
172f0 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
17300 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
17310 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
17320 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
17330 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
17340 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
17350 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
17360 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
17370 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
17380 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
17390 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
173a0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
173b0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
173c0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
173d0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
173e0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
173f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
17400 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
17410 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
17420 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
17430 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
17440 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
17450 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
17460 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
17470 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
17480 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
17490 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
174a0 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
174b0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
174c0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
174d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
174e0 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
174f0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
17500 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
17510 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
17520 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
17530 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
17540 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
17550 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
17560 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
17570 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
17580 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
17590 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
175a0 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
175b0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
175c0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
175d0 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
175f0 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
17600 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
17610 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
17620 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
17630 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
17640 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
17670 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
17680 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
17690 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
176a0 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
176b0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
176c0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
176d0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
176e0 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
176f0 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
17700 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
17710 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
17720 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
17730 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
17740 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
17750 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
17760 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
17770 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17780 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
17790 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
177a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
177b0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
177c0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
177d0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
177e0 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
177f0 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
17800 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
17810 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
17820 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
17830 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
17840 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
17850 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
17860 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17870 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
17880 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
17890 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
178a0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
178b0 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
178c0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
178d0 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
178e0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
178f0 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
17900 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
17910 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
17920 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
17930 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
17940 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
17950 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
17960 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
17970 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
17980 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
17990 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
179a0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
179b0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
179c0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
179d0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
179e0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
179f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65  .         && pCe
17a00 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
17a10 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  w+3<=pPage->aDat
17a20 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
17a30 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
17a40 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
17a50 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
17a60 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b  low]).        ){
17a70 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
17a80 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
17a90 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
17aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
17ab0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
17ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17ad0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
17ae0 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
17af0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
17b00 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
17b10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
17b20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17b30 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
17b40 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
17b50 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
17b60 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
17b70 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
17b80 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
17b90 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
17ba0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
17bb0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
17bc0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
17bd0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
17be0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
17bf0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
17c00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
17c10 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
17c20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
17c30 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
17c40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17c50 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
17c60 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
17c70 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
17c80 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
17c90 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
17ca0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
17cb0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
17cc0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
17cd0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
17ce0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
17cf0 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
17d00 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
17d10 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
17d20 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
17d30 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
17d40 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
17d50 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
17d60 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
17d70 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
17d80 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
17d90 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
17da0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
17db0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
17dc0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
17dd0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
17de0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
17df0 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
17e00 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
17e10 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
17e20 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
17e30 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
17e40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17e50 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
17e60 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
17e70 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
17e80 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
17e90 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
17ea0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
17eb0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
17ec0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
17ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
17ee0 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
17ef0 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
17f00 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
17f10 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
17f20 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
17f30 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
17f40 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
17f50 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
17f60 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
17f70 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
17f80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
17f90 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
17fa0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
17fb0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
17fc0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
17fd0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
17fe0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
17ff0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
18000 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
18010 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
18020 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
18030 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
18040 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
18050 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
18060 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18070 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
18080 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
18090 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
180a0 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
180b0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
180c0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
180d0 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
180e0 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
180f0 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
18100 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
18110 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
18120 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
18130 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
18140 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
18150 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
18160 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
18170 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
18180 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
18190 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
181a0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
181b0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
181c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
181d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
181e0 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
181f0 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
18200 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
18210 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
18220 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
18230 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
18240 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
18250 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
18260 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
18270 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
18280 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
18290 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
182a0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
182b0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
182c0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
182d0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
182e0 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
182f0 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
18300 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
18310 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
18320 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
18330 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
18340 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
18350 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
18360 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
18370 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
18380 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
18390 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
183a0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
183b0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
183c0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
183d0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
183e0 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
183f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18410 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
18430 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
18440 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
18450 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
18460 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
18470 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
18480 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
18490 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
184a0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
184b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
184c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
184d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
184e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
184f0 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
18500 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
18510 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
18520 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
18530 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
18540 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
18550 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
18560 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
18570 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
18580 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
18590 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
185a0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
185b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
185c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
185d0 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
185e0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
185f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18600 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
18620 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
18630 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
18640 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18660 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
18670 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
18680 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18690 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
186a0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
186b0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
186c0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
186d0 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
186e0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
186f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18710 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
18720 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
18730 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
18740 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18750 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
18760 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
18770 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
18780 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
18790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
187a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
187b0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
187c0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
187d0 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
187e0 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
187f0 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
18800 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
18810 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
18820 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
18830 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
18840 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
18850 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
18860 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
18870 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
18880 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
18890 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
188a0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
188b0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
188c0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
188d0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
188e0 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
188f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
18900 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
18910 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62  ganize the datab
18920 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20  ase so .** that 
18930 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
18940 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
18950 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f  tly in use is no
18960 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
18970 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
18980 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  nFin is the numb
18990 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
189a0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
189b0 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
189c0 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  were this functi
189d0 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20  on called until 
189e0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
189f0 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_DONE..**.** If
18a00 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72   the bCommit par
18a10 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
18a20 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
18a30 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  n assumes that t
18a40 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69  he .** caller wi
18a50 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
18a60 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
18a70 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
18a80 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a  s SQLITE_DONE .*
18a90 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62  * or an error. b
18aa0 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64  Commit is passed
18ab0 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74   true for an aut
18ac0 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d  o-vacuum-on-comm
18ad0 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
18ae0 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
18af0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
18b00 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
18b10 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
18b20 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
18b30 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
18b40 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
18b50 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
18b60 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
18b70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18b80 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
18b90 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
18ba0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
18bb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18bc0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18bd0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18be0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
18bf0 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
18c00 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
18c10 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
18c20 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
18c30 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
18c40 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
18c50 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
18c60 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
18c70 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
18c80 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
18c90 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
18ca0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
18cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
18cc0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
18cd0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
18ce0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
18cf0 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
18d00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18d20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18d30 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
18d40 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
18d50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18d60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18d70 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
18d80 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
18d90 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
18da0 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
18db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
18dc0 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
18dd0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
18de0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
18df0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
18e00 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
18e10 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
18e20 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
18e30 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
18e40 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
18e50 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
18e60 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
18e70 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
18e80 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
18e90 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
18ea0 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
18eb0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
18ec0 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
18ed0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18ee0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
18ef0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
18f00 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
18f10 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
18f20 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
18f30 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
18f40 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
18f50 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
18f60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18f70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18f80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
18fa0 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
18fb0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
18fc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
18fd0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
18fe0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
18ff0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
19000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19010 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
19020 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
19030 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
19040 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
19050 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
19060 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
19070 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
19080 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
19090 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
190a0 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
190b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
190c0 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
190d0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
190e0 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
190f0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
19100 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
19110 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
19120 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19140 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19150 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
19160 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
19170 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
19180 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
19190 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
191a0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
191b0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
191c0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
191d0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
191e0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
191f0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
19200 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
19210 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
19220 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
19230 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
19240 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
19250 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
19260 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
19270 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
19280 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
19290 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
192a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
192b0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
192c0 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
192d0 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
192e0 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
192f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19300 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
19310 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
19320 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
19330 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
19340 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
19350 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
19360 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
19370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
19390 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
193a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
193b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
193c0 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
193d0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
193e0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
193f0 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
19400 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
19410 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
19420 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
19430 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
19440 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
19450 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
19460 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
19470 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
19480 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
19490 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
194a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
194b0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
194c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
194d0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
194e0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
194f0 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
19500 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
19510 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
19520 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19530 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
19540 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
19550 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
19560 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
19570 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
19580 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
19590 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
195a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
195b0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
195c0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
195d0 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
195e0 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
195f0 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
19600 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
19610 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
19620 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
19630 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
19640 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
19650 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
19660 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
19670 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
19680 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
19690 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
196a0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
196b0 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
196c0 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
196f0 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
19700 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
19710 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19730 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
19740 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
19750 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
19760 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
19770 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
19780 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
19790 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
197a0 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
197b0 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
197c0 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
197d0 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
197e0 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
197f0 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
19800 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
19810 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
19820 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
19830 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
19840 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19850 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
19860 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
19870 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
19880 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
19890 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
198a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
198b0 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
198c0 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
198d0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
198e0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
198f0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
19900 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
19910 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
19920 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
19930 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
19940 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
19950 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
19960 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
19970 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
19980 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
19990 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
199a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
199b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
199c0 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
199d0 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
199e0 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
199f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
19a00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
19a10 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
19a20 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
19a30 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
19a40 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
19a50 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
19a60 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19a70 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
19a80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
19a90 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
19aa0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
19ab0 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
19ac0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19ad0 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
19ae0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
19af0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
19b00 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
19b10 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
19b20 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
19b30 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
19b40 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
19b50 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
19b60 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
19b70 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
19b80 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
19b90 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
19ba0 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
19bb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19bc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
19bd0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
19be0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
19bf0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
19c00 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
19c10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19c20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19c30 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
19c40 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
19c50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
19c60 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
19c70 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
19c80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19c90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19ca0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
19cb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
19cc0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
19cd0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
19ce0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
19cf0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
19d00 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
19d10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19d20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
19d30 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
19d40 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
19d50 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19d60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19d70 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19d80 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
19d90 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
19da0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
19db0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
19dc0 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
19dd0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
19de0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
19df0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
19e00 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
19e10 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
19e20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19e30 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
19e40 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
19e50 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
19e60 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
19e70 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
19e80 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
19e90 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
19ea0 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
19eb0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
19ec0 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
19ed0 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
19ee0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
19ef0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
19f00 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
19f10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19f20 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
19f30 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
19f40 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
19f50 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
19f60 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
19f70 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
19f80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
19f90 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
19fa0 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
19fb0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
19fc0 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
19fd0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
19fe0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
19ff0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
1a000 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1a010 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a020 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1a030 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
1a040 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
1a050 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
1a060 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1a070 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1a080 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
1a090 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
1a0a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1a0b0 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
1a0c0 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
1a0d0 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
1a0e0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
1a0f0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
1a100 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
1a110 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1a120 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
1a130 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
1a140 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
1a150 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1a160 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
1a170 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
1a180 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
1a190 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
1a1a0 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
1a1b0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
1a1c0 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
1a1d0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
1a1e0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
1a1f0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
1a200 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
1a210 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
1a220 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
1a230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
1a240 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1a250 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1a260 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
1a270 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1a280 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1a290 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
1a2a0 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1a2b0 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
1a2c0 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
1a2d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1a2e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
1a2f0 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
1a300 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1a310 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1a320 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1a330 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
1a340 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
1a350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1a360 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
1a370 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1a380 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
1a390 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
1a3a0 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1a3b0 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
1a3c0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
1a3d0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1a3e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1a3f0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1a400 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1a410 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1a420 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1a430 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
1a440 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1a450 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1a460 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1a470 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1a480 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
1a490 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
1a4a0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1a4b0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1a4c0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
1a4d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a4e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1a4f0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1a500 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1a510 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1a520 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
1a530 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1a540 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
1a550 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
1a560 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a570 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
1a580 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
1a590 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
1a5a0 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
1a5b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a5c0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1a5d0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
1a5e0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1a5f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
1a600 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
1a610 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
1a620 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
1a630 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
1a640 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
1a650 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
1a660 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
1a670 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1a680 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
1a690 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1a6a0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1a6b0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
1a6c0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
1a6d0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
1a6e0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
1a6f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
1a700 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
1a710 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
1a720 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
1a730 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
1a740 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
1a750 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
1a760 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
1a770 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1a780 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1a790 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
1a7a0 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
1a7b0 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
1a7c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1a7d0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
1a7e0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
1a7f0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
1a800 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
1a810 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
1a820 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
1a830 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
1a840 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
1a850 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1a860 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
1a870 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
1a880 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
1a890 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
1a8a0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
1a8b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1a8c0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
1a8d0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
1a8e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
1a8f0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1a900 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
1a910 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
1a920 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1a930 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1a940 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1a950 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1a960 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
1a970 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
1a980 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
1a990 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
1a9a0 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
1a9b0 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
1a9c0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1a9d0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1a9e0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
1a9f0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
1aa00 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
1aa10 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
1aa20 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
1aa30 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
1aa40 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
1aa50 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
1aa60 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
1aa70 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
1aa80 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
1aa90 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
1aaa0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
1aab0 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
1aac0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1aad0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
1aae0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
1aaf0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
1ab00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ab10 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
1ab20 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
1ab30 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
1ab40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ab50 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
1ab60 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1ab70 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1ab80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1ab90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1aba0 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
1abb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1abc0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1abd0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1abe0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
1abf0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1ac00 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
1ac10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ac20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ac30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1ac40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ac50 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1ac60 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
1ac70 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
1ac80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ac90 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
1aca0 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
1acb0 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
1acc0 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
1acd0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1ace0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
1acf0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
1ad00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1ad10 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1ad20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ad30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1ad40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
1ad50 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
1ad60 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
1ad70 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
1ad80 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
1ad90 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
1ada0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
1adb0 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
1adc0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
1add0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
1ade0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1adf0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1ae00 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
1ae10 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1ae20 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1ae30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ae40 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ae50 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1ae60 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
1ae70 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1ae80 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
1ae90 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
1aea0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1aeb0 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
1aec0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
1aed0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
1aee0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1aef0 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
1af00 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
1af10 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
1af20 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
1af30 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
1af40 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
1af50 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1af60 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
1af70 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
1af80 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1af90 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1afa0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1afb0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
1afc0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
1afd0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
1afe0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
1aff0 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
1b000 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1b010 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
1b020 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
1b030 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1b040 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
1b050 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
1b060 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1b070 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
1b080 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1b090 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
1b0a0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
1b0b0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
1b0c0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
1b0d0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
1b0e0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
1b0f0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1b100 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1b110 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1b120 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
1b130 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
1b140 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
1b150 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b160 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
1b170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b180 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1b190 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1b1a0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
1b1b0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
1b1c0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
1b1d0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
1b1e0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
1b1f0 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
1b200 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
1b210 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1b220 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1b230 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1b240 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
1b250 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1b260 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
1b270 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1b280 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
1b290 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
1b2a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1b2b0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
1b2c0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
1b2d0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
1b2e0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
1b2f0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b300 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
1b310 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1b320 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
1b330 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
1b340 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
1b350 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
1b360 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b370 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
1b380 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
1b390 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
1b3a0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1b3b0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
1b3c0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
1b3d0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
1b3e0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
1b3f0 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
1b400 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
1b410 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
1b420 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
1b430 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
1b440 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
1b450 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
1b460 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1b470 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
1b480 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
1b490 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
1b4a0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
1b4b0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1b4c0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1b4d0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
1b4e0 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
1b4f0 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
1b500 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
1b510 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
1b520 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1b530 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
1b540 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
1b550 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
1b560 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
1b570 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
1b580 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
1b590 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
1b5a0 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
1b5b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
1b5c0 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
1b5d0 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
1b5e0 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
1b5f0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1b600 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1b610 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
1b620 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
1b630 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b640 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
1b650 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
1b660 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
1b670 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
1b680 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
1b690 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
1b6a0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
1b6b0 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
1b6c0 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
1b6d0 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
1b6e0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1b6f0 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
1b700 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
1b710 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
1b720 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
1b730 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
1b740 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
1b750 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
1b760 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
1b770 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1b780 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1b790 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b7a0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1b7b0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1b7c0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1b7d0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1b7e0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1b7f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1b800 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
1b810 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
1b820 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1b830 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1b840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b850 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
1b860 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1b870 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1b880 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
1b890 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
1b8a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1b8b0 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
1b8c0 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
1b8d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1b8e0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1b8f0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
1b900 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
1b910 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1b920 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1b930 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
1b940 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1b950 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
1b960 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b970 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
1b980 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1b990 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
1b9a0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
1b9b0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b9c0 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
1b9d0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1b9e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1b9f0 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
1ba00 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1ba10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1ba20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ba30 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
1ba40 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1ba50 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1ba60 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1ba70 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1ba80 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1ba90 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1baa0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1bab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74  .}../*.** Do bot
1bad0 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f  h phases of a co
1bae0 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mmit..*/.int sql
1baf0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
1bb00 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1bb10 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1bb20 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1bb30 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1bb40 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1bb50 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1bb60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bb70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1bb80 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1bb90 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  (p, 0);.  }.  sq
1bba0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1bbb0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1bbc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1bbd0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
1bbe0 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
1bbf0 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
1bc00 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
1bc10 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
1bc20 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61   cursor on BtSha
1bc30 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
1bc40 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ** references..*
1bc50 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
1bc60 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e  r is tripped, in
1bc70 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20  cluding cursors 
1bc80 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74  that belong.** t
1bc90 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
1bca0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
1bcb0 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73  t happen to be s
1bcc0 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61  haring.** the ca
1bcd0 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
1bce0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1bcf0 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
1bd00 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
1bd10 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63  occurs..** All c
1bd20 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65  ursors using the
1bd30 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74   same cache must
1bd40 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74   be tripped.** t
1bd50 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
1bd60 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73  rom trying to us
1bd70 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65  e the btree afte
1bd80 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  r.** the rollbac
1bd90 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  k.  The rollback
1bda0 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65   may have delete
1bdb0 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d  d tables.** or m
1bdc0 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c  oved root pages,
1bdd0 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   so it is not su
1bde0 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73  fficient to.** s
1bdf0 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
1be00 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
1be10 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  e cursor must be
1be20 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  .** invalidated.
1be30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1be40 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1be50 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
1be60 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b  e, int errCode){
1be70 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1be80 20 20 69 66 28 20 70 42 74 72 65 65 3d 3d 30 20    if( pBtree==0 
1be90 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1bea0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1beb0 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
1bec0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1bed0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1bee0 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
1bef0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1bf00 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
1bf10 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
1bf20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
1bf30 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
1bf40 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72  errCode;.    for
1bf50 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
1bf60 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
1bf70 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70  eleasePage(p->ap
1bf80 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Page[i]);.      
1bf90 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  p->apPage[i] = 0
1bfa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1bfb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1bfc0 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pBtree);.}../*.*
1bfd0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
1bfe0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
1bff0 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72  ogress.  All cur
1c000 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  sors will be.** 
1c010 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69  invalided by thi
1c020 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
1c030 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
1c040 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61   a cursor.** tha
1c050 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
1c060 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1c070 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  his operation wi
1c080 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ll result.** in 
1c090 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
1c0a0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1c0b0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1c0c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c0d0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1c0e0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1c0f0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1c100 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1c110 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1c120 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
1c130 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c  llback(Btree *p,
1c140 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a   int tripCode){.
1c150 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1c160 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1c170 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
1c180 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65  Page1;..  sqlite
1c190 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1c1a0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
1c1b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c1c0 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
1c1d0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1c1e0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  pBt, 0, 0);.  }e
1c1f0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
1c200 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1c210 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
1c220 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
1c230 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
1c240 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a   tripCode);.  }.
1c250 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1c260 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
1c270 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1c280 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1c290 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
1c2a0 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
1c2b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c2c0 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
1c2d0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1c2e0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
1c2f0 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
1c300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c310 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
1c320 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
1c330 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
1c340 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
1c350 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
1c360 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
1c370 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  l btreeGetPage()
1c380 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
1c390 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
1c3a0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
1c3b0 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
1c3c0 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
1c3d0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1c3e0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
1c3f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c400 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
1c410 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
1c420 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
1c430 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c440 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ( nPage==0 );.  
1c450 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1c460 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   ) sqlite3PagerP
1c470 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1c480 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
1c490 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c4a0 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65  Bt->nPage!=nPage
1c4b0 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   );.      pBt->n
1c4c0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1c4d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1c4e0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
1c4f0 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
1c500 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
1c510 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  , 1)==0 );.    p
1c520 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c530 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1c540 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
1c550 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
1c560 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
1c570 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
1c580 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1c590 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1c5a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
1c5b0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
1c5c0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
1c5d0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
1c5e0 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c   can can be roll
1c5f0 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
1c600 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
1c610 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1c620 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
1c630 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
1c640 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
1c650 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
1c660 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1c670 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
1c680 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
1c690 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
1c6a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
1c6b0 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
1c6c0 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
1c6d0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
1c6e0 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
1c6f0 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
1c700 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
1c710 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
1c720 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
1c730 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
1c740 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
1c750 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
1c760 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
1c770 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
1c780 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
1c790 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
1c7a0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
1c7b0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1c7c0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
1c7d0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
1c7e0 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
1c7f0 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
1c800 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1c810 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
1c820 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
1c830 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
1c840 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
1c850 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
1c860 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1c870 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
1c880 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
1c890 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
1c8a0 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
1c8b0 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
1c8c0 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
1c8d0 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
1c8e0 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
1c8f0 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
1c900 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
1c910 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
1c920 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
1c930 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
1c940 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
1c950 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
1c960 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
1c970 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
1c980 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1c990 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1c9a0 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
1c9b0 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
1c9c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1c9d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1c9e0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
1c9f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ca00 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
1ca10 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1ca20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
1ca30 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1ca40 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
1ca50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1ca60 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
1ca70 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1ca80 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
1ca90 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
1caa0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1cab0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1cac0 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
1cad0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
1cae0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1caf0 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
1cb00 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
1cb10 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
1cb20 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
1cb30 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
1cb40 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
1cb50 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
1cb60 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
1cb70 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
1cb80 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
1cb90 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
1cba0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
1cbb0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1cbc0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
1cbd0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
1cbe0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1cbf0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1cc00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
1cc10 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
1cc20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1cc30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1cc40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
1cc50 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1cc60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
1cc70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
1cc80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
1cc90 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
1cca0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
1ccb0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
1ccc0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
1ccd0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
1cce0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
1ccf0 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
1cd00 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
1cd10 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
1cd20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
1cd30 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
1cd40 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
1cd50 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1cd60 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
1cd70 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
1cd80 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
1cd90 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
1cda0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
1cdb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1cdc0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
1cdd0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
1cde0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
1cdf0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
1ce00 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
1ce10 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
1ce20 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
1ce30 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
1ce40 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
1ce50 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
1ce60 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
1ce70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1ce80 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
1ce90 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
1cea0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
1ceb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1cec0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
1ced0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1cee0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1cef0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1cf00 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1cf10 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
1cf20 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
1cf30 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1cf40 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
1cf50 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
1cf60 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
1cf70 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
1cf80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
1cf90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1cfa0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
1cfb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1cfc0 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
1cfd0 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
1cfe0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
1cff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d000 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
1d010 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42  vepoint<0 && (pB
1d020 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1d030 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1d040 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1d050 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b   pBt->nPage = 0;
1d060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1d070 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1d080 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  pBt);.      pBt-
1d090 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  >nPage = get4byt
1d0a0 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67  e(28 + pBt->pPag
1d0b0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20  e1->aData);..   
1d0c0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1d0d0 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74  se size was writ
1d0e0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66  ten into the off
1d0f0 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65  set 28 of the he
1d100 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  ader.      ** wh
1d110 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
1d120 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77  on started, so w
1d130 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1d140 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a  value at offset.
1d150 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e        ** 28 is n
1d160 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20  onzero. */.     
1d170 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
1d180 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  age>0 );.    }. 
1d190 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1d1a0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1d1b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d1c0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
1d1d0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
1d1e0 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
1d1f0 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
1d200 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
1d210 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
1d220 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
1d230 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1d240 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
1d250 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
1d260 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
1d270 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1d280 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
1d290 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
1d2a0 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
1d2b0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
1d2c0 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
1d2d0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
1d2e0 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
1d2f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1d300 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
1d310 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1d320 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
1d330 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
1d340 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
1d350 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1d360 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
1d370 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
1d380 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
1d390 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
1d3a0 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
1d3b0 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
1d3c0 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
1d3d0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
1d3e0 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
1d3f0 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
1d400 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
1d410 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
1d420 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
1d430 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
1d440 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
1d450 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
1d460 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
1d470 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
1d480 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
1d490 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
1d4a0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
1d4b0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
1d4c0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
1d4d0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
1d4e0 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
1d4f0 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
1d500 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
1d510 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
1d520 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
1d530 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
1d540 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
1d550 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
1d560 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
1d570 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
1d580 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1d590 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
1d5a0 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
1d5b0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
1d5c0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
1d5d0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
1d5e0 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
1d5f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1d600 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
1d610 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
1d620 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
1d630 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
1d640 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
1d650 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
1d660 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
1d670 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
1d680 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
1d690 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1d6a0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
1d6b0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
1d6c0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1d6d0 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
1d6e0 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
1d6f0 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
1d700 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
1d710 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
1d720 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1d730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
1d740 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
1d750 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d770 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
1d780 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
1d790 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d7b0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1d7c0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1d7d0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
1d800 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
1d810 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
1d820 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1d830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1d840 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
1d850 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1d860 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
1d870 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d890 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
1d8a0 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
1d8b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d8c0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
1d8d0 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
1d8e0 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
1d8f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1d900 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1d910 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
1d920 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1d930 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20  wrFlag==1 );..  
1d940 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1d950 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
1d960 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
1d970 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
1d980 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
1d990 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1d9a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
1d9b0 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
1d9c0 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
1d9d0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
1d9e0 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1d9f0 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
1da00 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
1da10 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
1da20 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
1da30 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1da40 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1da50 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
1da60 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67  yInfo!=0, wrFlag
1da70 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
1da80 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
1da90 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1daa0 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
1dab0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
1dac0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
1dad0 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
1dae0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
1daf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
1db00 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
1db10 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
1db20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
1db30 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1db40 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
1db50 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
1db60 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1db70 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ata );..  if( NE
1db80 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28 70  VER(wrFlag && (p
1db90 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1dba0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1dbb0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1dbc0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1dbd0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1dbe0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
1dbf0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1dc00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
1dc10 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
1dc20 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
1dc30 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1dc40 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1dc50 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1dc60 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1dc70 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1dc80 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1dc90 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1dca0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1dcb0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1dcc0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1dcd0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1dce0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1dcf0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1dd00 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1dd10 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1dd20 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1dd30 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1dd40 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42  ==0 || wrFlag==B
1dd50 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b  TCF_WriteFlag );
1dd60 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
1dd70 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43  s = wrFlag;.  pC
1dd80 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
1dd90 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
1dda0 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
1ddb0 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
1ddc0 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20  pPrev = pCur;.  
1ddd0 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  }.  pBt->pCursor
1dde0 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
1ddf0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1de00 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
1de10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1de20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1de30 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1de40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1de70 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1de80 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dea0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1deb0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1dec0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1ded0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1df00 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1df10 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1df20 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df40 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
1df50 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
1df60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1df90 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
1dfa0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1dfb0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1dfc0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1dfd0 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
1dfe0 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
1dff0 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
1e000 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1e010 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1e020 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e030 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
1e040 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
1e050 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
1e060 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
1e070 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
1e080 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
1e090 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
1e0a0 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
1e0b0 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
1e0c0 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
1e0d0 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
1e0e0 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
1e0f0 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
1e100 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
1e110 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
1e120 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
1e130 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
1e140 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
1e150 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1e160 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
1e170 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
1e180 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
1e190 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1e1a0 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
1e1b0 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
1e1c0 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
1e1d0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
1e1e0 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
1e1f0 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
1e200 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
1e210 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
1e220 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
1e230 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
1e240 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
1e250 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
1e260 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
1e270 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
1e280 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
1e290 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
1e2a0 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
1e2b0 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
1e2c0 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
1e2d0 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
1e2e0 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
1e2f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1e300 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
1e310 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
1e320 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
1e330 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
1e340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1e350 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
1e360 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
1e370 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1e380 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
1e390 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
1e3a0 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
1e3b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1e3c0 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
1e3d0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
1e3e0 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
1e3f0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
1e400 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1e410 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
1e420 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1e430 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1e440 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1e450 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
1e460 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1e470 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  r(pCur);.    if(
1e480 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a   pCur->pPrev ){.
1e490 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65        pCur->pPre
1e4a0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
1e4b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
1e4c0 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  e{.      pBt->pC
1e4d0 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
1e4e0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
1e4f0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1e500 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e  {.      pCur->pN
1e510 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1e520 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a  r->pPrev;.    }.
1e530 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1e540 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
1e550 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1e560 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1e570 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
1e580 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1e590 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
1e5a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 42 74  qlite3DbFree(pBt
1e5b0 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61  ree->db, pCur->a
1e5c0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f  Overflow);.    /
1e5d0 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  * sqlite3_free(p
1e5e0 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  Cur); */.    sql
1e5f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1e600 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
1e610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e620 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1e630 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
1e640 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1e650 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
1e660 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
1e670 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
1e680 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
1e690 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
1e6a0 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
1e6b0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
1e6c0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
1e6d0 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
1e6e0 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
1e6f0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
1e700 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
1e710 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
1e720 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
1e730 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74  r of calls to bt
1e740 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
1e750 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
1e760 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
1e770 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
1e780 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
1e790 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
1e7a0 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
1e7b0 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
1e7c0 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
1e7d0 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
1e7e0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
1e7f0 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
1e800 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
1e810 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
1e820 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
1e830 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
1e840 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
1e850 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
1e860 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1e870 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
1e880 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
1e890 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
1e8a0 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
1e8b0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
1e8c0 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
1e8d0 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
1e8e0 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
1e8f0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1e900 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
1e910 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
1e920 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1e930 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1e940 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
1e950 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1e960 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1e970 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
1e980 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
1e990 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1e9a0 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
1e9b0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
1e9c0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
1e9d0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
1e9e0 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  | memcmp(&info, 
1e9f0 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
1ea00 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
1ea10 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
1ea20 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
1ea30 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
1ea40 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
1ea50 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
1ea60 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
1ea70 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
1ea80 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
1ea90 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
1eaa0 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
1eab0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1eac0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1ead0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1eae0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67  {.      int iPag
1eaf0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1eb00 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
1eb10 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1eb20 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1eb30 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1eb40 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
1eb50 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
1eb60 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
1eb70 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
1eb80 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1eb90 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
1eba0 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
1ebb0 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
1ebc0 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
1ebd0 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
1ebe0 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
1ebf0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1ec00 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
1ec10 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
1ec20 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1ec60 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1ec70 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1ecb0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1ecc0 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1ed00 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1ed10 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1ed20 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1ed30 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1ed40 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 5c 0a 20  nfo);        \. 
1ed50 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
1ed60 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
1ed70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1eda0 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1edf0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
1ee00 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
1ee50 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66  _MSC_VER */..#if
1ee60 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
1ee70 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
1ee80 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
1ee90 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1eea0 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
1eeb0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1eec0 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
1eed0 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
1eee0 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
1eef0 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
1ef00 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
1ef10 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
1ef20 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
1ef30 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
1ef40 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
1ef50 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
1ef60 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1ef70 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
1ef80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1ef90 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
1efa0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1efb0 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
1efc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1efd0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
1efe0 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
1eff0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1f000 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
1f010 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
1f020 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
1f030 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
1f040 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
1f050 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
1f060 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1f070 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
1f080 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
1f090 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
1f0a0 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
1f0b0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
1f0c0 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
1f0d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1f0e0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
1f0f0 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
1f100 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1f110 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
1f120 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1f130 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
1f140 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
1f150 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1f160 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
1f170 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
1f180 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
1f190 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
1f1a0 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
1f1b0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1f1c0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1f1d0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1f1e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f1f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1f210 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f220 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
1f230 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f240 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  R_VALID );.  if(
1f250 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
1f260 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1f270 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
1f280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43   }else{.    getC
1f290 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1f2a0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
1f2b0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
1f2c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f2d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
1f2e0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1f2f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1f300 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
1f310 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
1f320 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1f330 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  nts to..**.** Th
1f340 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
1f350 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
1f360 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1f370 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
1f380 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
1f390 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1f3a0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
1f3b0 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
1f3c0 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
1f3d0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
1f3e0 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
1f3f0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
1f400 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
1f410 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73   possible.  This
1f420 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
1f430 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1f440 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  OK..** It might 
1f450 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20  just as well be 
1f460 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74  a procedure (ret
1f470 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74  urning void) but
1f480 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20   we continue.** 
1f490 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74  to return an int
1f4a0 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65  eger result code
1f4b0 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
1f4c0 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  reasons..*/.int 
1f4d0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1f4e0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1f4f0 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
1f500 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1f510 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f520 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1f530 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1f540 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1f550 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1f560 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  );.  *pSize = pC
1f570 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  ur->info.nData;.
1f580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f590 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  OK;.}../*.** Giv
1f5a0 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
1f5b0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
1f5c0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
1f5d0 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
1f5e0 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
1f5f0 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
1f600 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1f610 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
1f620 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
1f630 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
1f640 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
1f650 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
1f660 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
1f670 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
1f680 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
1f690 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
1f6a0 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
1f6b0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
1f6c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1f6d0 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
1f6e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f6f0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
1f700 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1f710 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
1f720 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
1f730 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
1f740 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
1f750 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
1f760 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
1f770 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1f780 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
1f790 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
1f7a0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
1f7b0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
1f7c0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
1f7d0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
1f7e0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
1f7f0 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
1f800 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
1f810 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
1f820 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
1f830 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1f840 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
1f850 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
1f860 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
1f870 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
1f880 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
1f890 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
1f8a0 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
1f8b0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
1f8c0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
1f8d0 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
1f8e0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
1f8f0 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
1f900 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
1f910 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
1f920 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
1f930 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1f940 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
1f950 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
1f960 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1f970 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1f980 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1f990 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1f9a0 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1f9c0 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
1f9d0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
1f9e0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
1f9f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
1fa00 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
1fa10 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
1fa20 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
1fa30 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
1fa40 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
1fa50 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1fa60 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
1fa70 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
1fa80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1fa90 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
1faa0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1fab0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1fac0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1fad0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1fae0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
1faf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fb00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
1fb10 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
1fb20 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1fb30 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
1fb40 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
1fb50 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
1fb60 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
1fb70 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
1fb80 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
1fb90 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
1fba0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
1fbb0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
1fbc0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
1fbd0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
1fbe0 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
1fbf0 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
1fc00 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
1fc10 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
1fc20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
1fc30 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
1fc40 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
1fc50 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1fc60 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
1fc70 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
1fc80 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
1fc90 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
1fca0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1fcb0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
1fcc0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
1fcd0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1fce0 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
1fcf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1fd00 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
1fd10 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
1fd20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1fd30 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
1fd40 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
1fd50 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1fd60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
1fd70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1fd80 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
1fd90 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
1fda0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
1fdb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1fdc0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
1fdd0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1fde0 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
1fdf0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
1fe00 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
1fe10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fe20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1fe30 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
1fe40 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
1fe50 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
1fe60 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
1fe70 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1fe80 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1fe90 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
1fea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1feb0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
1fec0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1fed0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1fee0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
1fef0 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
1ff00 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
1ff10 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
1ff20 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
1ff30 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
1ff40 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
1ff50 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
1ff60 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
1ff70 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
1ff80 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
1ff90 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
1ffa0 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
1ffb0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
1ffc0 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
1ffd0 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
1ffe0 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
1fff0 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
20000 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
20010 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
20020 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
20030 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
20040 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
20050 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
20060 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
20070 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
20080 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
20090 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
200a0 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
200b0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
200c0 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
200d0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
200e0 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
200f0 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
20100 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20110 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
20120 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
20130 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
20140 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
20150 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
20160 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
20170 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
20180 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
20190 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
201a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
201b0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
201c0 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
201d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
201e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
201f0 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
20200 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
20210 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
20220 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
20230 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
20240 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
20250 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
20260 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
20270 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
20280 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
20290 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
202a0 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
202b0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
202c0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
202d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
202e0 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
202f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20320 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
20330 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
20340 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
20350 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
20360 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
20370 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
20380 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
20390 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
203a0 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
203b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
203c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
203d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
203e0 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
203f0 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
20400 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
20410 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
20420 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
20430 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
20440 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
20450 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
20460 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
20470 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
20480 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
20490 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
204a0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
204b0 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
204c0 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
204d0 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
204e0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
204f0 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72  **   2: The oper
20500 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
20510 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65   Do not populate
20520 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
20530 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
20540 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
20550 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
20560 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
20570 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
20580 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
20590 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
205a0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
205b0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
205c0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
205d0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
205e0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
205f0 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
20600 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
20610 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
20620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
20630 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
20640 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
20650 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
20660 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65  ges and the.** e
20670 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  Op argument is n
20680 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74  ot 2, this funct
20690 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65  ion may allocate
206a0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
206b0 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 6c 75 61  azily .** poplua
206c0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
206d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
206e0 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
206f0 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
20700 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
20710 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
20720 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
20730 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
20740 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
20750 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
20760 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
20770 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
20780 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
20790 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
207a0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
207b0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
207c0 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
207d0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
207e0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
207f0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
20800 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
20810 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
20820 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
20830 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
20840 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
20850 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
20860 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
20870 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
20880 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
20890 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
208a0 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
208b0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
208c0 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
208d0 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
208e0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
208f0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
20900 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
20910 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
20920 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
20930 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
20940 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
20950 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
20960 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
20970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
20980 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
20990 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
209a0 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
209b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
209c0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
209d0 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
209e0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
209f0 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
20a00 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
20a10 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
20a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
20a30 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
20a40 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
20a50 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
20a60 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
20a70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20a80 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
20a90 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
20aa0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
20ab0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
20ac0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
20ad0 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
20ae0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
20af0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
20b00 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
20b30 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
20b40 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
20b50 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
20b60 57 5f 52 45 41 44 0a 20 20 69 6e 74 20 62 45 6e  W_READ.  int bEn
20b70 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20ba0 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f  reading to end o
20bb0 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66  f data */.#endif
20bc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
20bd0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
20be0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20bf0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
20c00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
20c10 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
20c20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
20c30 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20c40 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
20c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f   );.  assert( eO
20c60 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d  p!=2 || offset==
20c70 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 41 6c 77  0 );      /* Alw
20c80 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
20c90 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
20ca0 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
20cb0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
20cc0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
20cd0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
20ce0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
20cf0 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
20d00 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28  ->intKey ? 0 : (
20d10 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
20d20 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Key);.#ifdef SQL
20d30 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
20d40 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20  LOW_READ.  bEnd 
20d50 3d 20 28 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 6e  = (offset+amt==n
20d60 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
20d70 44 61 74 61 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Data);.#endif.. 
20d80 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65   if( NEVER(offse
20d90 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
20da0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a  r->info.nData) .
20db0 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
20dc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20dd0 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
20de0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
20df0 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
20e00 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
20e10 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
20e20 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
20e30 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
20e40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20e50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20e60 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
20e70 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
20e80 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
20e90 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
20ea0 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
20eb0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
20ec0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
20ed0 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
20ee0 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
20ef0 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
20f00 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
20f10 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
20f20 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
20f30 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
20f40 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
20f50 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
20f60 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31  , a, (eOp & 0x01
20f70 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ), pPage->pDbPag
20f80 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
20f90 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
20fa0 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
20fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
20fc0 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
20fd0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
20fe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20ff0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
21000 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
21010 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
21020 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
21030 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
21040 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
21050 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
21060 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
21070 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
21080 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
21090 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20  o.nLocal]);..   
210a0 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72   /* If the BtCur
210b0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  sor.aOverflow[] 
210c0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
210d0 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
210e0 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20   it now..    ** 
210f0 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61  Except, do not a
21100 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c 6f  llocate aOverflo
21110 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a  w[] for eOp==2..
21120 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
21130 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
21140 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
21150 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
21160 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
21170 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
21180 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
21190 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
211a0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
211b0 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
211c0 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
211d0 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
211e0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
211f0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
21200 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
21210 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
21220 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
21230 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
21240 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
21250 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28 70  if( eOp!=2 && (p
21260 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
21270 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
21280 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
21290 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
212a0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
212b0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
212c0 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
212d0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
212e0 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c  Ovfl>pCur->nOvfl
212f0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
21300 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50   Pgno *aNew = (P
21310 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44 62 52 65  gno*)sqlite3DbRe
21320 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
21330 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d     pCur->pBtree-
21340 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72  >db, pCur->aOver
21350 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69  flow, nOvfl*2*si
21360 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20  zeof(Pgno).     
21370 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
21380 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
21390 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
213a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
213b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
213c0 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c     pCur->nOvflAl
213d0 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20  loc = nOvfl*2;. 
213e0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
213f0 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b  Overflow = aNew;
21400 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21410 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
21420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21430 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
21440 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
21450 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
21460 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43  no));.        pC
21470 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
21480 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
21490 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
214a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
214b0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
214c0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
214d0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
214e0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
214f0 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
21500 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
21510 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
21520 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
21530 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
21540 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
21550 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
21560 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 26 26 20  alidOvfl)!=0 && 
21570 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21580 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
21590 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
215a0 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
215b0 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
215c0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
215d0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
215e0 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
215f0 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
21600 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20    }..    for( ; 
21610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21620 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
21630 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20  ge; iIdx++){..  
21640 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
21650 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
21660 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
21670 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
21680 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
21690 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
216a0 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a  alidOvfl)!=0 ){.
216b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
216c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
216d0 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
216e0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
216f0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
21700 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
21710 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
21720 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
21730 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
21740 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
21750 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
21760 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
21770 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
21780 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
21790 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
217a0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
217b0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
217c0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
217d0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
217e0 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
217f0 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
21800 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
21810 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
21820 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
21830 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
21840 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
21850 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
21860 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
21870 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
21880 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
21890 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76  ote that the aOv
218a0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
218b0 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
218c0 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a   because eOp!=2.
218d0 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e          ** here.
218e0 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65    If eOp==2, the
218f0 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20  n offset==0 and 
21900 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e  this branch is n
21910 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20  ever taken..    
21920 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
21930 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b  ssert( eOp!=2 );
21940 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21950 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
21960 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
21970 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
21980 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21990 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
219a0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
219b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
219c0 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
219d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
219e0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
219f0 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
21a00 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
21a10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
21a20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
21a30 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
21a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21a50 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
21a60 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
21a70 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
21a80 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
21a90 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
21aa0 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
21ab0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
21ac0 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
21ad0 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
21ae0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21af0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
21b00 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
21b10 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
21b20 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
21b30 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
21b40 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
21b50 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
21b60 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
21b70 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
21b80 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
21b90 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
21ba0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
21bb0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
21bc0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
21bd0 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
21be0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
21bf0 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
21c00 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
21c10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
21c20 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
21c30 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
21c40 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
21c50 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
21c60 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
21c70 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
21c80 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
21c90 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
21ca0 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
21cb0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
21cc0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
21cd0 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
21ce0 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
21cf0 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
21d00 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61    **   6) all da
21d10 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ta from the page
21d20 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a   is being read..
21d30 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
21d40 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20     ** then data 
21d50 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
21d60 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
21d70 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f  tabase file into
21d80 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
21d90 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62  output buffer, b
21da0 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67  ypassing the pag
21db0 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68  e-cache altogeth
21dc0 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a  er. This speeds.
21dd0 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f          ** up lo
21de0 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f  ading large reco
21df0 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61  rds that span ma
21e00 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
21e10 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
21e20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30        if( (eOp&0
21e30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20  x01)==0         
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e60 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
21e70 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20  && offset==0    
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ea0 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
21eb0 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e           && (bEn
21ec0 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65  d || a==ovflSize
21ed0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ef0 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
21f00 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
21f10 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
21f20 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
21f30 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a          /* (4) *
21f40 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
21f50 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
21f60 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
21f70 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
21f80 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
21f90 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67      && pBt->pPag
21fa0 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30  e1->aData[19]==0
21fb0 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20  x01             
21fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29            /* (5)
21fd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
21fe0 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
21ff0 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
22000 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
22010 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
22020 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
22030 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
22040 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22050 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
22060 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
22070 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
22080 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
22090 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
220a0 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
220b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
220c0 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
220d0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
220e0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
220f0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
22100 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
22110 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
22120 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
22130 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
22140 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
22150 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
22160 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d      ((eOp&0x01)=
22170 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
22180 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20  EADONLY : 0).   
22190 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
221a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
221b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
221c0 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
221d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
221e0 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
221f0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
22200 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
22210 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
22220 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
22230 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
22240 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
22250 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20   a, (eOp&0x01), 
22260 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
22270 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
22280 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
22290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
222a0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
222b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
222c0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
222d0 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
222e0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
222f0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
22300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
22310 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
22320 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22330 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
22340 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22350 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
22360 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
22370 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
22380 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
22390 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
223a0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
223b0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
223c0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
223d0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
223e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
223f0 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
22400 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
22410 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
22420 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ow.** in the tab
22430 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
22440 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22450 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
22460 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
22470 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
22480 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
22490 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
224a0 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
224b0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
224c0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
224d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
224e0 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
224f0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
22500 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
22510 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
22520 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22530 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22540 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22550 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22560 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
22570 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
22580 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
22590 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
225a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
225b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
225c0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
225d0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
225e0 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
225f0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
22600 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
22610 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
22620 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
22630 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
22640 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
22650 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
22660 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
22670 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
22680 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
22690 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
226a0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
226b0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
226c0 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
226d0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
226e0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
226f0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
22700 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
22710 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
22720 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
22730 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
22740 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
22750 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
22760 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22770 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
22780 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
22790 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
227a0 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
227b0 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
227c0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
227d0 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
227e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
227f0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
22800 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
22810 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
22820 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22830 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
22840 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
22850 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
22860 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
22870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22880 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
22890 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
228a0 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
228b0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
228c0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
228d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
228e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
228f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22900 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
22910 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22920 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
22930 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
22940 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
22950 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
22960 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22970 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22980 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
22990 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
229a0 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
229b0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
229c0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
229d0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
229e0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
229f0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
22a00 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
22a10 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
22a20 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
22a30 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
22a40 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
22a50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
22a60 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
22a70 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
22a80 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
22a90 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
22aa0 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
22ab0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
22ac0 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
22ad0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
22ae0 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
22af0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22b00 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
22b10 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
22b20 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
22b30 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
22b40 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
22b50 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
22b60 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
22b70 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
22b80 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
22b90 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
22ba0 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
22bb0 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
22bc0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
22bd0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
22be0 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
22bf0 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
22c00 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
22c10 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
22c20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
22c30 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
22c40 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
22c50 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
22c60 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
22c70 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
22c80 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
22c90 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
22ca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
22cb0 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
22cc0 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
22cd0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
22ce0 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
22cf0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
22d00 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
22d10 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
22d20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
22d30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
22d40 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
22d50 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
22d60 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
22d70 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
22d80 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
22d90 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
22da0 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
22db0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
22dc0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
22dd0 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
22de0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ){.  assert( pCu
22df0 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
22e00 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
22e10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22e20 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
22e30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22e40 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
22e50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22e60 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
22e70 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
22e80 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
22e90 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22ea0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
22eb0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
22ec0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
22ed0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22ee0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
22ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22f00 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29  ->info.nSize>0 )
22f10 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 70 43 75 72  ;.  *pAmt = pCur
22f20 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
22f30 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 28   return (void*)(
22f40 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
22f50 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
22f60 65 61 64 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  eader);.}.../*.*
22f70 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
22f80 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
22f90 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
22fa0 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
22fb0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
22fc0 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
22fd0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
22fe0 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
22ff0 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
23000 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
23010 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
23020 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
23030 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
23040 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
23050 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
23060 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
23070 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
23080 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
23090 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
230a0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
230b0 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
230c0 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
230d0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
230e0 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
230f0 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
23100 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
23110 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
23120 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
23130 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
23140 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
23150 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
23160 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
23170 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
23180 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
23190 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
231a0 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
231b0 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
231c0 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
231d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
231e0 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
231f0 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
23200 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
23210 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
23220 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
23230 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
23240 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
23250 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
23260 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
23270 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
23280 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
23290 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
232a0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
232b0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
232c0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
232d0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
232e0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
232f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
23300 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
23310 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
23320 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
23330 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
23340 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
23350 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
23360 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
23370 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
23380 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
23390 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
233a0 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
233b0 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
233c0 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
233d0 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
233e0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
233f0 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
23400 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
23410 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
23420 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69   int i = pCur->i
23430 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
23440 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53  *pNewPage;.  BtS
23450 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
23460 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
23470 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23480 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23490 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
234a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
234b0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
234c0 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
234d0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
234e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
234f0 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
23500 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
23510 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
23520 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
23530 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23540 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
23550 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
23560 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
23570 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20 20  , &pNewPage,.   
23580 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75              (pCu
23590 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
235a0 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
235b0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
235c0 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66  DONLY : 0);.  if
235d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
235e0 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
235f0 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
23600 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
23610 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
23620 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
23630 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
23640 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
23650 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
23660 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
23670 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
23680 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
23690 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69  1 || pNewPage->i
236a0 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50  ntKey!=pCur->apP
236b0 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[i]->intKey )
236c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
236d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
236e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
236f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
23700 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50   0./*.** Page pP
23710 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
23720 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
23730 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
23740 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
23750 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
23760 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
23770 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
23780 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
23790 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
237a0 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
237b0 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
237c0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
237d0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
237e0 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
237f0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
23800 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
23810 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
23820 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
23830 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
23840 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
23850 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
23860 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
23870 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
23880 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
23890 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
238a0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
238b0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
238c0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
238d0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
238e0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
238f0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
23900 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
23910 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
23920 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
23930 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
23940 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
23950 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
23960 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
23970 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
23980 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
23990 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
239a0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
239b0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
239c0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
239d0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
239e0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
239f0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
23a00 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
23a10 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
23a20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
23a30 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
23a40 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
23a50 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
23a60 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
23a70 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
23a80 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
23a90 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
23aa0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
23ab0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23ac0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23ad0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23ae0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23af0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23b00 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
23b10 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
23b20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
23b30 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a  );..  /* UPDATE:
23b40 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20   It is actually 
23b50 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
23b60 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65   condition teste
23b70 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 0a  d by the assert.
23b80 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65    ** below to be
23b90 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 20 64   untrue if the d
23ba0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
23bb0 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63 61  corrupt. This ca
23bc0 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20  n occur if.  ** 
23bd0 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  one cursor has m
23be0 6f 64 69 66 69 65 64 20 70 61 67 65 20 70 50 61  odified page pPa
23bf0 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66  rent while a ref
23c00 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20  erence to it is 
23c10 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20  held .  ** by a 
23c20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57  second cursor. W
23c30 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
23c40 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65  ppen if a single
23c50 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a   page is linked.
23c60 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74    ** into more t
23c70 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
23c80 74 72 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f  tructure in a co
23c90 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20  rrupt database. 
23ca0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
23cb0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
23cc0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
23cd0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
23ce0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
23cf0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
23d00 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
23d10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
23d20 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69  >pgno.  );.#endi
23d30 66 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  f.  testcase( pC
23d40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23d50 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
23d60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23d70 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
23d80 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
23d90 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23da0 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
23db0 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
23dc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
23dd0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
23de0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
23df0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
23e00 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a  alidOvfl);.}../*
23e10 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
23e20 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
23e30 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
23e40 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
23e50 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
23e60 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
23e70 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
23e80 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
23e90 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
23ea0 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
23eb0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
23ec0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
23ed0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
23ee0 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
23ef0 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
23f00 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
23f10 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
23f20 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
23f30 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
23f40 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
23f50 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
23f60 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
23f70 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
23f80 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
23f90 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
23fa0 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
23fb0 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
23fc0 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
23fd0 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72  R_INVALID. Other
23fe0 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72  wise, the cursor
23ff0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
24000 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   to the first.**
24010 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
24020 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69   the root (or vi
24030 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65  rtual root) page
24040 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
24050 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20  state.** is set 
24060 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
24070 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
24080 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
24090 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
240a0 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
240b0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
240c0 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
240d0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
240e0 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
240f0 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
24100 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
24110 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
24120 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
24130 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
24140 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
24150 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
24160 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
24170 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
24180 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
24190 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
241a0 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
241b0 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
241c0 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
241d0 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
241e0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
241f0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
24200 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
24210 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
24220 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
24230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
24240 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
24250 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
24260 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
24270 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24280 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
24290 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
242a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
242b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
242c0 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
242d0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
242e0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
242f0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
24300 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
24310 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
24320 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
24330 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
24340 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
24350 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
24360 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
24370 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24380 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
24390 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
243a0 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
243b0 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
243c0 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
243d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
243e0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
243f0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
24400 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
24410 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  e>=0 ){.    whil
24420 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29  e( pCur->iPage )
24430 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
24440 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24450 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c  iPage--]);.  }el
24460 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
24470 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
24480 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
24490 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
244a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
244b0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
244c0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
244d0 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
244e0 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
244f0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
24500 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
24510 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75              (pCu
24520 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
24530 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
24540 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
24550 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
24560 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24570 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
24580 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24590 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
245a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
245b0 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
245c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f   = 0;.  }.  pRoo
245d0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
245e0 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
245f0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
24600 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
24610 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
24620 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
24630 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
24640 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
24650 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
24660 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
24670 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
24680 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
24690 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
246a0 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
246b0 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
246c0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
246d0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
246e0 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
246f0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
24700 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
24710 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
24720 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
24730 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
24740 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
24750 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
24760 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
24770 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
24780 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
24790 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
247a0 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
247b0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
247c0 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
247d0 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
247e0 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
247f0 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
24800 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
24810 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
24820 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
24830 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
24840 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
24850 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
24860 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
24870 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
24880 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
24890 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
248a0 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
248b0 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
248c0 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
248d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
248e0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
248f0 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
24900 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
24910 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
24920 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
24930 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
24940 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
24950 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
24960 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
24970 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
24980 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24990 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
249a0 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
249b0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
249c0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
249d0 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
249e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
249f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
24a00 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
24a10 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
24a20 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
24a30 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
24a40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
24a50 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
24a60 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
24a70 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
24a80 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
24a90 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
24aa0 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74  VALID;.  }.  ret
24ab0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24ac0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
24ad0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
24ae0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
24af0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
24b00 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
24b10 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
24b20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
24b30 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
24b40 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
24b50 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
24b60 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
24b70 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
24b80 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
24b90 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
24ba0 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
24bb0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
24bc0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24bd0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
24be0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
24bf0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24c00 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24c10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
24c20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24c30 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
24c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24c50 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
24c60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24c70 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
24c80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
24c90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
24ca0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
24cb0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
24cc0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
24cd0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
24ce0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24cf0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
24d00 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
24d10 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
24d20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24d30 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
24d40 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
24d50 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
24d60 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
24d70 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
24d80 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
24d90 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
24da0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
24db0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
24dc0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
24dd0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
24de0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
24df0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
24e00 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
24e10 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
24e20 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
24e30 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
24e40 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
24e50 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
24e60 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
24e70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
24e80 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
24e90 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
24ea0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
24eb0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
24ec0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
24ed0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
24ee0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
24ef0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24f00 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
24f10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24f20 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
24f30 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
24f40 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24f50 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24f60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24f70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24f80 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
24f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24fa0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
24fb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24fc0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
24fd0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
24fe0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
24ff0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
25000 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
25010 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25020 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
25030 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
25040 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
25050 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pgno);.  }.  if(
25060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25070 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  {.    pCur->aiId
25080 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
25090 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
250a0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
250b0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
250c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
250d0 20 7e 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79   ~BTCF_ValidNKey
250e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
250f0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
25100 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
25110 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
25120 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
25130 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
25140 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
25150 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
25160 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
25170 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
25180 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
25190 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
251a0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
251b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
251c0 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
251d0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
251e0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
251f0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
25200 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25210 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25220 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
25230 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
25240 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
25250 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
25260 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
25270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25280 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
25290 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
252a0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
252b0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
252c0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
252d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
252e0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
252f0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
25300 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25310 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25320 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25330 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
25340 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
25350 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
25360 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
25370 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
25380 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
25390 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
253a0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
253b0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
253c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
253d0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
253e0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
253f0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
25400 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
25410 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
25420 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
25430 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
25440 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
25450 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
25460 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25470 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
25480 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
25490 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
254a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
254b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
254c0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
254d0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
254e0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
254f0 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
25500 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
25510 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
25520 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
25530 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
25540 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
25550 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
25560 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
25570 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
25580 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
25590 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
255a0 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
255b0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
255c0 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
255d0 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
255e0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
255f0 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
25600 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
25610 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
25620 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
25630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
25640 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
25650 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
25660 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
25670 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25680 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25690 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
256a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
256b0 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
256c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
256d0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
256e0 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
256f0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
25700 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
25710 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
25720 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
25730 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25740 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
25750 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
25760 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
25770 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
25780 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
25790 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
257a0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
257b0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
257c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
257d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
257e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
257f0 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
25800 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
25810 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
25820 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
25830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
25850 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
25860 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
25870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25880 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
25890 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
258a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20  .      }.   .   
258b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
258c0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
258d0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
258e0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
258f0 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
25900 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
25910 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
25920 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
25930 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
25940 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
25950 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
25960 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
25970 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
25980 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
25990 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
259a0 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
259b0 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
259c0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
259d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
259e0 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
259f0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
25a00 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
25a10 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
25a20 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
25a30 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
25a40 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
25a50 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
25a60 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
25a70 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
25a80 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
25a90 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
25aa0 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
25ab0 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
25ac0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
25ad0 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
25ae0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
25af0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
25b00 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
25b10 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
25b20 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
25b30 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
25b40 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
25b50 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
25b60 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
25b70 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
25b80 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
25b90 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
25ba0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
25bb0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
25bd0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
25be0 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
25bf0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
25c00 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
25c10 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
25c20 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
25c30 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
25c40 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
25c50 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
25c60 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
25c70 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
25c80 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
25c90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
25ca0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
25cb0 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
25cc0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
25cd0 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
25ce0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
25cf0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
25d00 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
25d20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
25d30 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
25d40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25d50 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
25d60 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
25d70 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
25d80 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
25d90 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
25da0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
25db0 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
25dc0 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
25dd0 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
25de0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25df0 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
25e00 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
25e10 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
25e20 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
25e30 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
25e40 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
25e50 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
25e60 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
25e70 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
25e80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
25e90 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78   RecordCompare x
25ea0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a  RecordCompare;..
25eb0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25ec0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25ed0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
25ee0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25ef0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
25f00 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
25f10 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
25f20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
25f30 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
25f40 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
25f50 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
25f60 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
25f70 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
25f80 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
25f90 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
25fa0 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
25fb0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
25fc0 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
25fd0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
25fe0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25ff0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
26000 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
26010 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43  Key)!=0.   && pC
26020 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
26030 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
26040 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
26050 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
26060 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
26070 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26080 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
26090 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
260a0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
260b0 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d  ast)!=0 && pCur-
260c0 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
260d0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
260e0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
260f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
26110 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78  pIdxKey ){.    x
26120 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
26130 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
26140 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b  ompare(pIdxKey);
26150 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 69 73  .    pIdxKey->is
26160 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20  Corrupt = 0;.   
26170 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79   assert( pIdxKey
26180 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20  ->default_rc==1 
26190 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
261a0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
261b0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
261c0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
261d0 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a  t_rc==-1.    );.
261e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65    }else{.    xRe
261f0 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b  cordCompare = 0;
26200 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65   /* All keys are
26210 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d   integers */.  }
26220 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
26230 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
26240 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
26250 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
26260 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
26270 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
26280 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26290 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
262a0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
262b0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
262c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
262d0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
262e0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
262f0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
26300 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
26310 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
26320 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20  Cell>0 );.  if( 
26330 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26340 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
26350 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
26360 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26370 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
26380 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26390 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
263a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
263b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
263c0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
263d0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
263e0 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
263f0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
26400 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
26410 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
26420 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
26430 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
26440 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26450 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
26460 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
26490 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
264a0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
264b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
264c0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
264d0 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
264e0 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
264f0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
26500 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
26510 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
26520 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
26530 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
26540 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
26550 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
26560 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
26570 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
26580 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
26590 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
265a0 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
265b0 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
265c0 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
265d0 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
265e0 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
265f0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
26600 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
26610 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
26620 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
26630 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
26640 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
26650 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
26660 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26670 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
26680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
26690 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
266a0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
266b0 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
266c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
266d0 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
266e0 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
266f0 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
26700 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
26710 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
26720 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
26730 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
26740 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   */.    pCur->ai
26750 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
26760 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
26770 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
26780 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
26790 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
267a0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
267b0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
267c0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
267d0 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
267e0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
267f0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
26800 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
26810 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
26820 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
26830 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26840 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
26850 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20  ataEnd ) return 
26860 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
26870 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
26880 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26890 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
268a0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
268b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
268c0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
268d0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
268e0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
268f0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
26900 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
26910 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
26920 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
26930 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
26940 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
26950 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26960 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
26970 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
26980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26990 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
269a0 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
269b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
269c0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
269d0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
269e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
269f0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
26a00 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
26a10 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26a20 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
26a30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26a40 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
26a50 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20              lwr 
26a60 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
26a70 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e     goto moveto_n
26a80 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20  ext_layer;.     
26a90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26aa0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
26ab0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
26ac0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26ad0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
26ae0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
26af0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
26b10 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
26b20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
26b30 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
26b40 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
26b50 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d  r)/2; */.      }
26b60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26b70 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
26b80 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
26b90 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
26ba0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
26bb0 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
26bc0 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20  dPtrSize;..     
26bd0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
26be0 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
26bf0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
26c00 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
26c10 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
26c20 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
26c30 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
26c40 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
26c50 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
26c60 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
26c70 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
26c80 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
26c90 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
26ca0 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
26cb0 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
26cc0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
26cd0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
26ce0 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
26cf0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
26d00 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
26d10 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
26d20 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
26d30 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
26d40 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
26d50 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
26d60 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
26d70 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
26d80 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
26d90 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
26da0 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
26db0 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
26dc0 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
26dd0 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
26de0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
26df0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
26e00 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
26e10 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
26e20 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
26e30 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
26e40 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
26e50 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
26e60 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
26e70 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
26e80 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
26e90 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
26ea0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
26eb0 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
26ec0 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
26ed0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
26ee0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
26ef0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
26f00 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
26f10 70 49 64 78 4b 65 79 2c 20 30 29 3b 0a 20 20 20  pIdxKey, 0);.   
26f20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
26f30 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
26f40 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
26f50 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
26f60 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
26f70 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
26f80 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
26f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
26fa0 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
26fb0 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
26fc0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
26fd0 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
26fe0 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
26ff0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
27000 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
27010 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
27020 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
27030 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
27040 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
27050 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
27060 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
27070 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
27080 78 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  xKey, 0);.      
27090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
270a0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
270b0 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
270c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
270d0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
270e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
270f0 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
27100 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
27110 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
27120 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
27130 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
27140 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
27150 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
27160 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
27170 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
27180 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
27190 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
271a0 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
271b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
271c0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
271d0 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
271e0 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
271f0 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
27200 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
27210 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
27220 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
27230 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
27240 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
27250 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
27260 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
27270 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
27280 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
27290 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  oc( nCell );.   
272a0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
272b0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
272c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
272d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
272e0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
272f0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
27300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
27310 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27320 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
27330 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
27340 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
27350 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
27360 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
27370 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20  )pCellKey, 2);. 
27380 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
27390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
273a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
273b0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
273c0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
273d0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
273e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
273f0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
27400 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
27410 20 70 49 64 78 4b 65 79 2c 20 30 29 3b 0a 20 20   pIdxKey, 0);.  
27420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27430 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
27440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27450 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65    assert( pIdxKe
27460 79 2d 3e 69 73 43 6f 72 72 75 70 74 3d 3d 30 20  y->isCorrupt==0 
27470 7c 7c 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  || c==0 );.     
27480 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
27490 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
274a0 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
274b0 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
274c0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
274d0 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
274e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
274f0 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
27500 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
27510 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
27520 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
27530 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
27540 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
27550 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
27560 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
27570 79 2d 3e 69 73 43 6f 72 72 75 70 74 20 29 20 72  y->isCorrupt ) r
27580 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
27590 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
275a0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
275b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
275c0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
275d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
275e0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
275f0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
27600 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
27610 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
27620 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
27630 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
27640 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
27650 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
27660 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
27670 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
27680 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
27690 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
276a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
276b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
276c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
276d0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
276e0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
276f0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
27700 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27710 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
27720 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
27730 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
27740 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
27750 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
27760 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
27770 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
27780 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
27790 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
277a0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
277b0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
277c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
277d0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
277e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
277f0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
27800 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
27810 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69    }.    pCur->ai
27820 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27830 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
27840 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
27850 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
27860 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
27870 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
27880 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
27890 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
278a0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
278b0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
278c0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
278d0 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  vfl);.  return r
278e0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
278f0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
27900 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
27910 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
27920 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
27930 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
27940 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
27950 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
27960 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
27970 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
27980 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
27990 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
279a0 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
279b0 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
279c0 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
279d0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
279e0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
279f0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
27a00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27a10 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
27a20 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
27a30 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
27a40 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
27a50 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
27a60 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
27a70 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
27a80 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
27a90 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
27aa0 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
27ab0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
27ac0 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
27ad0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
27ae0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
27af0 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
27b00 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
27b10 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
27b20 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
27b30 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
27b40 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
27b50 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
27b60 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
27b70 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
27b80 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
27b90 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
27ba0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
27bb0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27bc0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
27bd0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
27be0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
27bf0 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
27c00 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
27c10 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
27c20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
27c30 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
27c40 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
27c50 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
27c60 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
27c70 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
27c80 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
27c90 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
27ca0 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
27cb0 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
27cc0 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
27cd0 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
27ce0 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
27cf0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
27d00 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
27d10 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
27d20 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
27d30 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
27d40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
27d50 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
27d60 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
27d70 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
27d80 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
27d90 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
27da0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
27db0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
27dc0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
27dd0 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
27de0 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
27df0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
27e00 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
27e10 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
27e20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
27e30 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
27e40 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
27e50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
27e60 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
27e70 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
27e80 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
27e90 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
27ea0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
27eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
27ec0 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
27ed0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
27ee0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
27ef0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
27f00 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
27f10 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
27f20 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
27f30 4c 49 44 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c  LID ){.    inval
27f40 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
27f50 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 72 63  he(pCur);.    rc
27f60 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
27f70 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
27f80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
27fa0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
27fb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
27fc0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
27fd0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
27fe0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
27ff0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
28000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28020 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
28030 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28040 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28050 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
28060 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28070 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
28080 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
28090 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
280a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
280b0 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a  ->skipNext>0 ){.
280c0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
280d0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
280e0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
280f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
28100 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
28110 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
28120 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
28130 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
28140 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28150 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
28160 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
28170 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28180 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
28190 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20  isInit );..  /* 
281a0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
281b0 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c  file is corrupt,
281c0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
281d0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  for the value of
281e0 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65   idx .  ** to be
281f0 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54   invalid here. T
28200 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
28210 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63  ur if a second c
28220 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20  ursor modifies. 
28230 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69   ** the page whi
28240 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  le cursor pCur i
28250 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
28260 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69  rence to it. Whi
28270 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79  ch can.  ** only
28280 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64   happen if the d
28290 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
282a0 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  pt in such a way
282b0 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a   as to link the.
282c0 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d    ** page into m
282d0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
282e0 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ree structure. *
282f0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64  /.  testcase( id
28300 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x>pPage->nCell )
28310 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
28320 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
28330 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28340 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
28350 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
28360 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
28370 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
28380 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
28390 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
283a0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
283b0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
283c0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
283d0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
283e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
283f0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
28400 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
28410 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
28420 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
28430 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
28440 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
28450 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28460 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
28470 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
28480 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
28490 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
284a0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
284b0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
284c0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
284d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
284e0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
284f0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
28500 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
28510 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28520 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
28530 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
28540 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
28550 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
28560 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
28570 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
28580 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
28590 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
285a0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
285b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
285c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
285d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
285e0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
285f0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
28600 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
28610 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28620 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
28630 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
28640 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
28650 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
28660 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
28670 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
28680 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
28690 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
286a0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
286b0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
286c0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
286d0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
286e0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
286f0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
28700 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
28710 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
28720 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
28730 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
28740 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
28750 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
28760 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
28770 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
28780 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
28790 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
287a0 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
287b0 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
287c0 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
287d0 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
287e0 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
287f0 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
28800 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
28810 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
28820 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
28830 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
28840 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
28850 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
28860 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
28870 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
28880 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
28890 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
288a0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
288b0 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
288c0 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
288d0 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
288e0 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
288f0 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
28900 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
28910 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
28920 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
28930 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
28940 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
28950 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
28960 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20  owever.).*/.int 
28970 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
28980 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
28990 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
289a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
289b0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
289c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
289d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
289e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
289f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
28a00 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
28a10 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
28a20 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
28a30 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
28a40 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
28a50 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75  ID );.  pCur->cu
28a60 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
28a70 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
28a80 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70  idOvfl);.  if( p
28a90 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
28aa0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
28ab0 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
28ac0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
28ad0 5f 52 45 51 55 49 52 45 53 45 45 4b 29 20 29 7b  _REQUIRESEEK) ){
28ae0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
28af0 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
28b00 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
28b10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28b30 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
28b40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28b50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28b60 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
28b70 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
28b80 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
28b90 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
28ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28bb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
28bc0 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
28bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28be0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28bf0 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
28c00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
28c10 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
28c20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28c30 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
28c40 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
28c50 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
28c60 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
28c70 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
28c80 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
28c90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28ca0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
28cb0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
28cc0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
28cd0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
28ce0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28cf0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
28d00 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
28d10 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
28d20 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
28d30 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
28d40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
28d50 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
28d60 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
28d70 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
28d80 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
28d90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28da0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
28db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28dc0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  }.    rc = moveT
28dd0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
28de0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
28df0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
28e00 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
28e10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
28e20 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
28e30 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
28e40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
28e50 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
28e60 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
28e70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28e80 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
28e90 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
28ea0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
28eb0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
28ec0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
28ed0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
28ee0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
28ef0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a  CF_ValidOvfl);..
28f00 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
28f10 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
28f20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
28f30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28f40 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
28f50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
28f60 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
28f70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28f80 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
28f90 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
28fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
28fb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28fc0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20    }.  }.  *pRes 
28fd0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
28fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
28ff0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
29000 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
29010 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
29020 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
29030 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
29040 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
29050 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29060 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
29070 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
29080 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
29090 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
290a0 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
290b0 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
290c0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
290d0 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
290e0 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
290f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29100 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
29110 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
29120 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
29130 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
29140 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
29150 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
29160 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
29170 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
29180 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
29190 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
291a0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
291b0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
291c0 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
291d0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
291e0 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
291f0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
29200 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
29210 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
29220 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
29230 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
29240 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
29250 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
29260 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
29270 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
29280 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
29290 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
292a0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
292b0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
292c0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
292d0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
292e0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
292f0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
29300 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
29310 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
29320 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
29330 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
29340 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
29350 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
29360 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
29370 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
29380 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
29390 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
293a0 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
293b0 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
293c0 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
293d0 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
293e0 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
293f0 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
29400 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
29410 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
29420 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
29430 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
29440 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
29450 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
29460 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
29470 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
29480 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
29490 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
294a0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
294b0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
294c0 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
294d0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
294e0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
294f0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
29500 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
29510 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
29520 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
29530 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
29540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
29550 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
29560 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
29570 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
29580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
29590 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
295a0 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
295b0 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
295c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
295d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
295e0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
295f0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
29600 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
29610 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
29620 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
29630 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
29640 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
29650 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
29660 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
29670 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
29680 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
29690 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
296a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
296b0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
296c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
296d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
296e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
296f0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
29700 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
29710 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
29720 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
29730 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
29740 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
29750 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
29760 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
29770 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
29780 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
29790 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
297a0 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
297b0 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
297c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
297d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
297e0 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
297f0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
29800 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
29810 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
29820 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
29830 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
29840 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
29850 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
29860 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
29870 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
29880 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
29890 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
298a0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
298b0 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
298c0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
298d0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
298e0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
298f0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
29900 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
29910 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
29920 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
29930 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
29940 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
29950 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
29960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29970 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
29980 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
29990 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
299a0 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
299b0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
299c0 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
299d0 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
299e0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
299f0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
29a00 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
29a10 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
29a20 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
29a30 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
29a40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
29a50 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
29a60 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
29a70 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
29a80 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
29a90 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
29aa0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
29ab0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
29ac0 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
29ad0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
29ae0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
29af0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
29b00 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
29b10 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
29b20 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
29b30 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
29b40 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
29b50 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
29b60 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
29b70 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
29b80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29b90 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
29ba0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
29bb0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29bc0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
29bd0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
29be0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
29bf0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
29c00 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
29c10 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
29c20 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
29c30 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
29c40 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
29c50 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
29c60 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
29c70 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
29c80 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
29c90 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
29ca0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
29cb0 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
29cc0 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
29cd0 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
29ce0 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
29cf0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
29d00 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
29d10 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
29d20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
29d30 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
29d40 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
29d50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
29d60 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
29d70 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
29d80 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
29d90 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
29da0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
29db0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
29dc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29dd0 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
29de0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
29df0 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
29e00 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
29e10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
29e20 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
29e30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
29e40 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
29e50 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
29e60 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
29e70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
29e80 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
29e90 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
29ea0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
29eb0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
29ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
29ed0 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
29ee0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
29ef0 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20  aData!=0 );..   
29f00 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
29f10 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
29f20 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76  ]); /* # of leav
29f30 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b  es on this trunk
29f40 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
29f50 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
29f60 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
29f70 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
29f80 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
29f90 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
29fa0 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
29fb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
29fc0 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
29fd0 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
29fe0 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
29ff0 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
2a000 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
2a010 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2a020 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
2a030 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2a040 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a050 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2a060 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2a070 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2a080 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2a090 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a0a0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
2a0b0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2a0c0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2a0d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2a0e0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2a0f0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
2a100 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2a110 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2a120 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2a130 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2a140 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2a150 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2a160 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2a170 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a180 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
2a190 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
2a1a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
2a1b0 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
2a1c0 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
2a1d0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
2a1e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2a1f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2a200 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
2a210 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2a220 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2a230 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2a240 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
2a250 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
2a260 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
2a270 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
2a280 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
2a290 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
2a2a0 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
2a2b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
2a2c0 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
2a2d0 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
2a2e0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
2a2f0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2a300 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
2a310 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2a320 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
2a330 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2a340 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2a350 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
2a360 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2a370 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
2a380 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2a390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a3a0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2a3b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2a3c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2a3d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a3e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2a3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a400 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
2a410 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2a420 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2a430 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2a440 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2a450 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2a460 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2a470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a490 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2a4a0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2a4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a4c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a4d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a4e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2a4f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2a500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a510 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
2a520 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2a530 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2a540 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2a550 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2a560 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2a570 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
2a580 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2a590 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
2a5a0 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
2a5b0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
2a5c0 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
2a5d0 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
2a5e0 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
2a5f0 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
2a600 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
2a610 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
2a620 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
2a630 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
2a640 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
2a650 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
2a660 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2a670 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
2a680 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
2a690 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
2a6a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a6b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2a6c0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2a6d0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2a6e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2a6f0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2a700 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
2a710 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2a720 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2a730 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
2a740 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
2a750 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
2a760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2a780 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2a790 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2a7a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
2a7b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a7c0 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
2a7d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2a7e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a7f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a800 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2a810 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2a820 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2a830 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a840 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a850 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2a860 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
2a870 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2a880 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2a890 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
2a8a0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
2a8b0 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
2a8c0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2a8d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
2a8e0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
2a8f0 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
2a900 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2a910 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
2a920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2a930 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2a940 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2a950 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2a960 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
2a970 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2a980 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2a990 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2a9a0 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
2a9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2a9c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2a9d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a9e0 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2a9f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2aa00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2aa10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2aa20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2aa30 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2aa40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2aa50 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
2aa60 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2aa70 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2aa80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aa90 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
2aaa0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2aab0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2aac0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
2aad0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
2aae0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
2aaf0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2ab00 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
2ab10 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
2ab20 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
2ab30 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
2ab40 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
2ab50 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
2ab60 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
2ab70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
2ab80 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
2ab90 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ta;.        if( 
2aba0 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
2abb0 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
2abc0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2abd0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2abe0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2abf0 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _LE ){.         
2ac00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b     for(i=0; i<k;
2ac10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2ac20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
2ac30 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
2ac40 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *4]);.          
2ac50 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e      if( iPage<=n
2ac60 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
2ac70 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2ac80 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2ac90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2aca0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2acb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2acc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2acd0 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
2ace0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2acf0 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  st = sqlite3AbsI
2ad00 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
2ad10 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
2ad20 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2ad30 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
2ad40 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2ad50 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
2ad60 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2ad70 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2ad80 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ada0 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
2adb0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
2adc0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
2add0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
2ade0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
2adf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2ae00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ae10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ae20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2ae30 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2ae40 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
2ae50 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
2ae60 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
2ae70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2ae80 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
2ae90 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
2aea0 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
2aeb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2aec0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2aed0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2aee0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2aef0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2af00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
2af10 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
2af20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
2af30 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
2af40 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
2af50 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
2af60 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
2af70 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
2af80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2af90 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
2afa0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2afb0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
2afc0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2afd0 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
2afe0 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
2aff0 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
2b000 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
2b010 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
2b020 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2b030 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
2b040 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
2b050 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
2b060 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2b070 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b080 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2b090 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b0a0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
2b0b0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2b0c0 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
2b0d0 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
2b0e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
2b0f0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2b100 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
2b110 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2b120 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
2b130 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
2b140 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
2b150 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
2b160 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
2b170 42 74 2c 20 2a 70 50 67 6e 6f 29 20 3f 20 50 41  Bt, *pPgno) ? PA
2b180 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
2b190 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
2b1a0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2b1b0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
2b1c0 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
2b1d0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
2b1e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b1f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2b200 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b210 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2b220 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2b230 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2b240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b250 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2b260 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2b270 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b290 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2b2a0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2b2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
2b2c0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
2b2d0 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
2b2e0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
2b2f0 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
2b300 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
2b310 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
2b320 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
2b330 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65  reelist, so appe
2b340 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  nd a new page to
2b350 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2b360 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
2b370 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c  **.    ** Normal
2b380 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c  ly, new pages al
2b390 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
2b3a0 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71  block can be req
2b3b0 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  uested from the.
2b3c0 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79      ** pager lay
2b3d0 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
2b3e0 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
2b3f0 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  t. This prevents
2b400 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
2b410 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
2b420 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20   read the pages 
2b430 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
2b440 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
2b450 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
2b460 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  t transaction ha
2b470 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e  s already run on
2b480 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d  e or more increm
2b490 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20  ental-vacuum.   
2b4a0 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20   ** steps, then 
2b4b0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
2b4c0 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74  about to allocat
2b4d0 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f  e may contain co
2b4e0 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  ntent.    ** tha
2b4f0 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  t is required in
2b500 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
2b510 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  rollback. In thi
2b520 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a  s case, do.    *
2b530 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f  * not set the no
2b540 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54  -content flag. T
2b550 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70  his causes the p
2b560 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64  ager to load and
2b570 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2b580 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2b590 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20   content before 
2b5a0 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a  overwriting it..
2b5b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2b5c0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
2b5d0 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  r will not actua
2b5e0 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  lly attempt to l
2b5f0 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a  oad or journal .
2b600 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
2b610 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  or any page that
2b620 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65   really does lie
2b630 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2b640 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
2b650 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73    ** file on dis
2b660 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74  k. So the effect
2b670 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74  s of disabling t
2b680 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70  he no-content op
2b690 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
2b6a0 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69  * here are confi
2b6b0 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67  ned to those pag
2b6c0 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77  es that lie betw
2b6d0 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
2b6e0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2b6f0 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65  se image and the
2b700 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2b710 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
2b720 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e  /.    int bNoCon
2b730 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74  tent = (0==IfNot
2b740 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
2b750 72 75 6e 63 61 74 65 29 29 20 3f 20 50 41 47 45  runcate)) ? PAGE
2b760 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
2b770 3a 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  : 0;..    rc = s
2b780 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b790 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
2b7a0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2b7b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2b7c0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
2b7d0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
2b7e0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
2b7f0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
2b800 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
2b810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b820 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2b830 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2b840 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
2b850 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
2b860 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
2b870 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
2b880 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
2b890 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
2b8a0 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
2b8b0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
2b8c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2b8d0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
2b8e0 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
2b8f0 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
2b900 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
2b910 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
2b920 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
2b930 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
2b940 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
2b950 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
2b960 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
2b970 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2b980 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
2b990 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
2b9a0 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
2b9b0 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
2b9c0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
2b9d0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2b9e0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
2b9f0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2ba00 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  age(pBt, pBt->nP
2ba10 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f  age, &pPg, bNoCo
2ba20 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  ntent);.      if
2ba30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ba40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2ba50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ba60 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
2ba70 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ba80 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
2ba90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2baa0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2bab0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
2bac0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2bad0 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
2bae0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2baf0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
2bb00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2bb10 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
2bb20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
2bb30 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
2bb40 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
2bb50 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
2bb60 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
2bb70 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
2bb80 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2bb90 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2bba0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
2bbb0 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74   ppPage, bNoCont
2bbc0 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
2bbd0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2bbe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2bbf0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
2bc00 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
2bc10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bc20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
2bc30 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
2bc40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
2bc50 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2bc60 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
2bc70 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
2bc80 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
2bc90 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
2bca0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2bcb0 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
2bcc0 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
2bcd0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
2bce0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
2bcf0 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
2bd00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bd10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
2bd20 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
2bd30 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2bd40 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
2bd50 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2bd60 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
2bd70 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
2bd80 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2bd90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2bda0 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
2bdb0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
2bdc0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
2bdd0 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2bde0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2bdf0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2be00 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
2be10 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
2be20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2be30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2be40 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2be50 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
2be60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2be70 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
2be80 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
2be90 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
2bea0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2beb0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
2bec0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
2bed0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2bee0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2bef0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2bf00 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
2bf10 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
2bf20 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
2bf30 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
2bf40 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
2bf50 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
2bf60 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
2bf70 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
2bf80 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
2bf90 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
2bfa0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
2bfb0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
2bfc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
2bfd0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
2bfe0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
2bff0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2c000 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
2c010 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
2c020 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
2c030 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2c040 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2c050 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
2c060 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
2c070 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
2c080 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
2c090 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0b0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
2c0c0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
2c0d0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0f0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2c100 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
2c110 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
2c120 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
2c130 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
2c140 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
2c150 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
2c160 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2c170 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2c180 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2c190 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
2c1a0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
2c1b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2c1e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
2c1f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2c210 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2c220 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
2c230 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
2c240 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2c250 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2c260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
2c270 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
2c280 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
2c290 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
2c2a0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
2c2b0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
2c2c0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
2c2d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2c2e0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
2c2f0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2c300 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
2c310 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2c320 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
2c330 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2c340 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
2c350 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
2c360 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c370 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2c380 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2c390 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2c3a0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
2c3b0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2c3c0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2c3d0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2c3e0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
2c3f0 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
2c400 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2c410 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
2c420 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2c430 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
2c440 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2c450 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
2c460 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
2c470 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
2c480 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
2c490 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2c4a0 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
2c4b0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
2c4c0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
2c4d0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
2c4e0 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
2c4f0 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
2c500 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2c510 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
2c520 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
2c530 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2c540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
2c550 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
2c560 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
2c570 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
2c580 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2c590 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
2c5a0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
2c5b0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2c5c0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
2c5d0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
2c5e0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
2c5f0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
2c600 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2c610 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
2c620 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
2c630 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
2c640 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
2c650 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2c660 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
2c670 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
2c680 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
2c690 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
2c6a0 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
2c6b0 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
2c6c0 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
2c6d0 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
2c6e0 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
2c6f0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
2c700 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
2c710 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2c720 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
2c730 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
2c740 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
2c750 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2c760 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2c770 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
2c780 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
2c790 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
2c7a0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
2c7b0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
2c7c0 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
2c7d0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
2c7e0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
2c7f0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
2c800 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
2c810 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
2c820 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
2c830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c840 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2c850 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
2c860 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
2c870 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
2c880 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2c890 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
2c8a0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2c8b0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2c8c0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2c8d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c8e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2c8f0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2c900 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
2c910 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2c920 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
2c930 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2c940 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
2c950 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
2c960 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
2c970 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
2c980 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c990 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2c9a0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2c9b0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2c9c0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
2c9d0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2c9e0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
2c9f0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
2ca00 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
2ca10 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
2ca20 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
2ca30 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
2ca40 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
2ca50 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
2ca60 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
2ca70 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
2ca80 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
2ca90 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
2caa0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
2cab0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2cac0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
2cad0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2cae0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
2caf0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
2cb00 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
2cb10 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2cb20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
2cb30 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
2cb40 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
2cb50 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
2cb60 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2cb70 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
2cb80 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
2cb90 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2cba0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
2cbb0 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
2cbc0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
2cbd0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
2cbe0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
2cbf0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
2cc00 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
2cc10 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
2cc20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
2cc30 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
2cc40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2cc50 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
2cc60 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
2cc70 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
2cc80 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
2cc90 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
2cca0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
2ccb0 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
2ccc0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
2ccd0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
2cce0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
2ccf0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
2cd00 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
2cd10 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
2cd20 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
2cd30 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
2cd40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2cd50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2cd60 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2cd70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2cd80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cd90 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2cda0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2cdb0 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
2cdc0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2cdd0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2cde0 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
2cdf0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2ce00 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
2ce10 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2ce20 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
2ce30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2ce40 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2ce50 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2ce60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2ce70 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2ce80 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
2ce90 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
2cea0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
2ceb0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2cec0 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
2ced0 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
2cee0 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
2cef0 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
2cf00 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2cf10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2cf20 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
2cf30 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
2cf40 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
2cf50 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2cf60 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
2cf70 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
2cf80 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
2cf90 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
2cfa0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2cfb0 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
2cfc0 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
2cfd0 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
2cfe0 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
2cff0 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
2d000 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2d010 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
2d020 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
2d030 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2d040 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
2d050 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
2d060 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2d070 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
2d080 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
2d090 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
2d0a0 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
2d0b0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2d0c0 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
2d0d0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2d0e0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
2d0f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d100 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2d110 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
2d120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
2d130 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2d140 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
2d150 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
2d160 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
2d170 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2d180 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
2d190 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2d1a0 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
2d1b0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
2d1c0 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
2d1d0 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
2d1e0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2d1f0 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
2d200 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
2d210 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
2d220 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2d230 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
2d240 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2d250 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2d260 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
2d270 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2d280 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
2d290 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
2d2a0 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
2d2b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d2c0 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
2d2d0 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
2d2e0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
2d2f0 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
2d300 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
2d310 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2d320 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
2d330 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
2d340 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
2d350 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2d360 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
2d370 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
2d380 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2d390 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
2d3a0 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
2d3b0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
2d3c0 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
2d3d0 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
2d3e0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
2d3f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2d400 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2d410 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
2d420 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2d430 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2d440 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
2d450 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
2d460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d470 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
2d480 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
2d490 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2d4a0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2d4b0 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
2d4c0 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
2d4d0 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
2d4e0 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
2d4f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d500 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
2d510 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
2d520 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
2d530 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
2d540 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
2d550 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2d560 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
2d570 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2d580 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
2d590 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2d5a0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
2d5b0 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
2d5c0 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
2d5d0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
2d5e0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
2d5f0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
2d600 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
2d610 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
2d620 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
2d630 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
2d640 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2d650 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
2d660 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
2d670 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
2d680 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
2d690 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
2d6a0 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
2d6b0 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
2d6c0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
2d6d0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2d6e0 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
2d6f0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
2d700 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
2d710 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
2d720 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
2d730 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2d740 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
2d750 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2d760 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2d770 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
2d780 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
2d790 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
2d7a0 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
2d7b0 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
2d7c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2d7d0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2d7e0 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
2d7f0 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
2d800 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
2d810 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
2d820 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
2d830 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
2d840 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
2d850 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
2d860 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
2d870 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
2d880 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
2d890 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2d8a0 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
2d8b0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2d8c0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
2d8d0 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
2d8e0 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
2d8f0 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
2d900 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
2d910 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
2d920 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
2d930 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
2d940 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
2d950 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
2d960 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
2d970 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
2d980 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2d990 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
2d9a0 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
2d9b0 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
2d9c0 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
2d9d0 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
2d9e0 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
2d9f0 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
2da00 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
2da10 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
2da20 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
2da30 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
2da40 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
2da50 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
2da60 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
2da70 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
2da80 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
2da90 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
2daa0 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
2dab0 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
2dac0 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
2dad0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2dae0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2daf0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2db00 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2db10 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
2db20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
2db30 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
2db40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2db50 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
2db60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2db70 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
2db80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
2db90 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
2dba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2dbb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2dbc0 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
2dbd0 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
2dbe0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
2dbf0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
2dc00 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
2dc10 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
2dc20 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
2dc30 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
2dc40 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
2dc50 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
2dc60 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
2dc70 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
2dc80 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
2dc90 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2dca0 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
2dcb0 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
2dcc0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
2dcd0 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
2dce0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
2dcf0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
2dd00 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
2dd10 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
2dd20 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
2dd30 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
2dd40 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
2dd50 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
2dd60 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
2dd70 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
2dd80 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
2dd90 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
2dda0 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
2ddb0 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
2ddc0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
2ddd0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2dde0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
2ddf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2de00 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2de10 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
2de20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2de30 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
2de40 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
2de50 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
2de60 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2de70 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2de80 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
2de90 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2dea0 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
2deb0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
2dec0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dee0 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
2def0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
2df00 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
2df10 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2df20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2df30 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
2df40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
2df50 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
2df60 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
2df70 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
2df80 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
2df90 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2dfa0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
2dfb0 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
2dfc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2dfd0 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
2dfe0 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
2dff0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2e000 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2e010 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
2e020 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
2e030 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
2e040 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
2e050 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2e060 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2e070 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
2e080 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
2e090 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
2e0a0 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
2e0b0 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
2e0c0 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
2e0d0 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
2e0e0 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
2e0f0 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
2e100 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
2e110 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2e120 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
2e130 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2e140 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2e150 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2e160 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2e170 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2e180 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2e190 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
2e1a0 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
2e1b0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e1c0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2e1d0 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
2e1e0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
2e1f0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
2e200 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
2e210 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
2e220 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
2e230 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
2e240 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
2e250 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2e260 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
2e270 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
2e280 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
2e290 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2e2a0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2e2b0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
2e2c0 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
2e2d0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2e2e0 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
2e2f0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
2e300 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
2e310 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
2e320 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
2e330 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
2e340 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
2e350 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
2e360 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2e370 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2e380 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2e390 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
2e3a0 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
2e3b0 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66   NEVER(nKey>0x7f
2e3c0 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
2e3d0 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
2e3e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2e3f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2e400 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
2e410 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
2e420 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
2e430 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
2e440 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
2e450 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
2e460 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
2e470 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
2e480 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
2e490 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
2e4a0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
2e4b0 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
2e4c0 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
2e4d0 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
2e4e0 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
2e4f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2e500 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
2e510 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
2e520 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
2e530 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
2e540 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
2e550 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2e560 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2e570 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
2e580 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
2e590 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
2e5a0 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
2e5b0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2e5c0 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
2e5d0 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
2e5e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2e5f0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2e600 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2e610 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2e620 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
2e630 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
2e640 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
2e650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e660 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2e670 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2e680 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
2e690 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
2e6a0 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
2e6b0 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
2e6c0 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
2e6d0 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
2e6e0 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
2e6f0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2e700 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
2e710 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
2e720 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2e730 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
2e740 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
2e750 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
2e760 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
2e770 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
2e780 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
2e790 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
2e7a0 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
2e7b0 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
2e7c0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
2e7d0 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
2e7e0 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
2e7f0 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
2e800 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
2e810 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
2e820 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
2e830 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
2e840 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
2e850 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
2e860 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
2e870 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2e880 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2e890 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2e8a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
2e8b0 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
2e8c0 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
2e8d0 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
2e8e0 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
2e8f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2e900 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
2e910 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
2e920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2e930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2e940 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
2e950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e960 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2e970 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e980 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e990 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
2e9a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e9b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2e9c0 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
2e9d0 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
2e9e0 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
2e9f0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
2ea00 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
2ea10 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
2ea20 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
2ea30 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2ea40 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
2ea50 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
2ea60 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
2ea70 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
2ea80 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
2ea90 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
2eaa0 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
2eab0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
2eac0 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
2ead0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
2eae0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
2eaf0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2eb00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2eb10 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
2eb20 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
2eb30 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2eb40 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2eb50 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2eb60 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2eb70 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2eb80 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
2eb90 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
2eba0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
2ebb0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2ebc0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
2ebd0 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
2ebe0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
2ebf0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
2ec00 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
2ec10 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
2ec20 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
2ec30 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
2ec40 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
2ec50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2ec60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
2ec70 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
2ec80 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
2ec90 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
2eca0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
2ecb0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
2ecc0 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
2ecd0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
2ece0 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
2ecf0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
2ed00 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
2ed10 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
2ed20 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
2ed30 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
2ed40 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
2ed50 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2ed60 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
2ed70 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
2ed80 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
2ed90 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
2eda0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
2edb0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
2edc0 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
2edd0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2ede0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2edf0 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
2ee00 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
2ee10 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2ee20 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2ee30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2ee40 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ee50 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2ee60 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
2ee70 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
2ee80 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
2ee90 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
2eea0 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
2eeb0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
2eec0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
2eed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eee0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
2eef0 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
2ef00 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
2ef10 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
2ef20 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
2ef30 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
2ef40 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
2ef50 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
2ef60 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
2ef70 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2ef80 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2ef90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
2efa0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2efb0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
2efc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2efd0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
2efe0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
2eff0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
2f000 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
2f010 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
2f020 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
2f030 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
2f040 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
2f050 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
2f060 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
2f070 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
2f080 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
2f090 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
2f0a0 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
2f0b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2f0c0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
2f0d0 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
2f0e0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
2f0f0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
2f100 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
2f110 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
2f120 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2f130 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
2f140 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32  int *pRC){.  u32
2f150 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
2f160 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
2f170 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
2f180 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
2f190 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2f1a0 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
2f1b0 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
2f1c0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
2f1d0 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
2f1e0 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
2f1f0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
2f200 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2f210 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2f220 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
2f230 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
2f240 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
2f250 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
2f260 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
2f270 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
2f280 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
2f290 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
2f2a0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2f2b0 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  ( sz==cellSize(p
2f2c0 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
2f2d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2f2e0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2f2f0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2f300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2f310 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2f320 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2f330 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  x) );.  data = p
2f340 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
2f350 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65  tr = &pPage->aCe
2f360 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20  llIdx[2*idx];.  
2f370 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
2f380 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  r);.  hdr = pPag
2f390 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2f3a0 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65  testcase( pc==ge
2f3b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2f3c0 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  +5]) );.  testca
2f3d0 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65  se( pc+sz==pPage
2f3e0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2f3f0 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20  e );.  if( pc < 
2f400 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64  (u32)get2byte(&d
2f410 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70  ata[hdr+5]) || p
2f420 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  c+sz > pPage->pB
2f430 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
2f440 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
2f450 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2f460 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2f470 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
2f480 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
2f490 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2f4a0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2f4b0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
2f4c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
2f4d0 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
2f4e0 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
2f4f0 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
2f500 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2f510 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
2f520 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
2f530 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a  Free += 2;.}../*
2f540 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
2f550 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
2f560 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
2f570 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
2f580 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
2f590 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
2f5a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
2f5b0 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
2f5c0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
2f5d0 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
2f5e0 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
2f5f0 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
2f600 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
2f610 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2f620 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
2f630 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
2f640 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
2f650 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
2f660 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
2f670 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66   in pPage->apOvf
2f680 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
2f690 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
2f6a0 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
2f6b0 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
2f6c0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
2f6d0 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
2f6e0 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
2f6f0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
2f700 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
2f710 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
2f720 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
2f730 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
2f740 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
2f750 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
2f760 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2f770 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
2f780 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
2f790 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
2f7a0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2f7b0 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
2f7c0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
2f7d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
2f7e0 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
2f7f0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
2f800 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
2f810 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
2f820 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
2f830 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
2f840 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
2f850 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
2f860 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
2f870 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2f880 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
2f890 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
2f8a0 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
2f8b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2f8c0 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
2f8d0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
2f8e0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
2f8f0 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
2f900 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2f910 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
2f920 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
2f930 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
2f940 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
2f950 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
2f960 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
2f970 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
2f980 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
2f990 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
2f9a0 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
2f9b0 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
2f9c0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
2f9d0 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
2f9e0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
2f9f0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
2fa00 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
2fa10 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
2fa20 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
2fa30 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
2fa40 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
2fa50 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
2fa60 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
2fa70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2fa80 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2fa90 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
2faa0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
2fab0 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
2fac0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2fad0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2fae0 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
2faf0 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
2fb00 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
2fb10 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
2fb20 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ted */.  int cel
2fb30 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
2fb40 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
2fb50 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
2fb60 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
2fb70 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
2fb80 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
2fb90 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
2fba0 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28  .  int nSkip = (
2fbb0 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b  iChild ? 4 : 0);
2fbc0 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
2fbd0 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
2fbe0 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
2fbf0 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
2fc00 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
2fc10 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28  assert( MX_CELL(
2fc20 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39  pPage->pBt)<=109
2fc30 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  21 );.  assert( 
2fc40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
2fc50 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2fc60 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
2fc70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2fc80 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
2fc90 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2fca0 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
2fcb0 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
2fcc0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
2fcd0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2fce0 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
2fcf0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2fd00 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2fd10 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2fd20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
2fd30 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
2fd40 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
2fd50 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
2fd60 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
2fd70 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
2fd80 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
2fd90 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
2fda0 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
2fdb0 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
2fdc0 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
2fdd0 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
2fde0 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
2fdf0 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
2fe00 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
2fe10 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
2fe20 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
2fe30 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
2fe40 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
2fe50 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
2fe60 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
2fe70 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
2fe80 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
2fe90 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
2fea0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
2feb0 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
2fec0 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
2fed0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
2fee0 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
2fef0 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
2ff00 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
2ff10 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
2ff20 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2ff30 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
2ff40 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2ff50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
2ff60 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2ff70 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
2ff80 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2ff90 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
2ffa0 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
2ffb0 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
2ffc0 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
2ffd0 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
2ffe0 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  apOvfl[0])) );. 
2fff0 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c     pPage->apOvfl
30000 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  [j] = pCell;.   
30010 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
30020 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  ] = (u16)i;.  }e
30030 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
30040 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30050 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
30060 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
30070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30080 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
30090 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
300a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
300b0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
300c0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
300d0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
300e0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
300f0 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
30100 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
30110 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
30120 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
30130 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
30140 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
30150 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
30160 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
30170 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
30180 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
30190 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
301a0 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
301b0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
301c0 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
301d0 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
301e0 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
301f0 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
30200 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
30210 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
30220 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
30230 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
30240 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
30250 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
30260 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
30270 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
30280 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
30290 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
302a0 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
302b0 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
302c0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
302d0 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
302e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
302f0 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
30300 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  d);.    }.    me
30310 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b  mmove(&data[ins+
30320 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20  2], &data[ins], 
30330 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75  end-ins);.    pu
30340 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
30350 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
30360 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
30370 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
30380 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
30390 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
303a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
303b0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
303c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
303d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
303e0 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
303f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
30400 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
30410 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
30420 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
30430 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
30440 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
30450 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
30460 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
30470 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
30480 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
30490 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
304a0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
304b0 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
304c0 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
304d0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
304e0 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
304f0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
30500 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
30510 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
30520 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
30530 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
30540 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
30550 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
30560 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
30570 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
30580 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
30590 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
305a0 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
305b0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
305c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
305d0 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
305e0 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
305f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
30600 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
30610 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
30620 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
30630 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
30640 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
30650 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
30660 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
30670 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
30680 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
30690 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
306a0 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
306b0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
306c0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
306d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
306e0 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
306f0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
30700 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
30710 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
30720 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
30730 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
30740 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
30750 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
30760 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
30770 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
30780 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
30790 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
307a0 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
307b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
307c0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
307d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
307e0 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
307f0 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58  & nCell<=(int)MX
30800 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
30810 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
30820 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50   (int)MX_CELL(pP
30830 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
30840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30850 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30860 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
30870 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  age) );..  /* Ch
30880 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
30890 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
308a0 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61  zeroed by zeroPa
308b0 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge() */.  assert
308c0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
308d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  0 );.  assert( g
308e0 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
308f0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55  data[hdr+5])==nU
30900 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c  sable );..  pCel
30910 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61  lptr = &pPage->a
30920 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d  CellIdx[nCell*2]
30930 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e  ;.  cellbody = n
30940 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d  Usable;.  for(i=
30950 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  nCell-1; i>=0; i
30960 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20  --){.    u16 sz 
30970 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
30980 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
30990 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73     cellbody -= s
309a0 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  z;.    put2byte(
309b0 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
309c0 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
309d0 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
309e0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b   apCell[i], sz);
309f0 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
30a00 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
30a10 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
30a20 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
30a30 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
30a40 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65  e->nFree -= (nCe
30a50 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d  ll*2 + nUsable -
30a60 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
30a70 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
30a80 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
30a90 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
30aa0 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
30ab0 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
30ac0 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
30ad0 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
30ae0 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
30af0 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
30b00 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
30b10 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
30b20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
30b30 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
30b40 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
30b50 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
30b60 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
30b70 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
30b80 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
30b90 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
30ba0 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
30bb0 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
30bc0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
30bd0 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
30be0 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
30bf0 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
30c00 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
30c10 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
30c20 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
30c30 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
30c40 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
30c50 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
30c60 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
30c70 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
30c80 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
30c90 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
30ca0 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
30cb0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
30cc0 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
30cd0 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
30ce0 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
30cf0 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
30d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30d10 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
30d20 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
30d30 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
30d40 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
30d50 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
30d60 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
30d70 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
30d80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30d90 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
30da0 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
30db0 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
30dc0 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
30dd0 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
30de0 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
30df0 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
30e00 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
30e10 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
30e20 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
30e30 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
30e40 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
30e50 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
30e60 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
30e70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
30e80 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
30e90 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
30ea0 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
30eb0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
30ec0 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
30ed0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
30ee0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
30ef0 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
30f00 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
30f10 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
30f20 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
30f30 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
30f40 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
30f50 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
30f60 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
30f70 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
30f80 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
30f90 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
30fa0 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
30fb0 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
30fc0 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
30fd0 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
30fe0 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
30ff0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
31000 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
31010 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
31020 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
31030 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
31040 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
31050 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
31060 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
31070 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
31080 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
31090 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
310a0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
310b0 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
310c0 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
310d0 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
310e0 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
310f0 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
31100 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
31110 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
31120 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
31130 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
31140 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
31150 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
31160 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
31170 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
31180 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
31190 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
311a0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
311b0 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
311c0 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
311d0 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
311e0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
311f0 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
31200 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
31210 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
31220 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
31230 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
31240 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
31250 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
31260 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
31270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31280 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
31290 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
312a0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
312b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
312d0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
312e0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
312f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31300 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
31310 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
31320 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
31330 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
31340 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
31350 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31360 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
31370 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
31380 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
31390 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
313a0 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ow==1 );..  /* T
313b0 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  his error condit
313c0 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ion is now caugh
313d0 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
313e0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
313f0 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  n */.  if( pPage
31400 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  ->nCell==0 ) ret
31410 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31420 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
31430 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
31440 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
31450 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
31460 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
31470 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
31480 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31490 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
314a0 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
314b0 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
314c0 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
314d0 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
314e0 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
314f0 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
31500 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
31510 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
31520 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
31530 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
31540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31550 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
31560 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
31570 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
31580 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  Page->apOvfl[0];
31590 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
315a0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
315b0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
315c0 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
315d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
315e0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
315f0 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
31600 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
31610 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
31620 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
31630 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
31640 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
31650 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
31660 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
31670 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
31680 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
31690 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
316a0 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  zCell);..    /* 
316b0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
316c0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
316d0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
316e0 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
316f0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
31700 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
31710 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
31720 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
31730 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
31740 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
31750 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
31760 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
31770 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
31780 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
31790 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
317a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
317b0 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
317c0 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
317d0 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
317e0 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
317f0 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
31800 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
31810 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31820 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
31830 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
31840 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
31850 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
31860 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
31870 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
31880 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
31890 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
318a0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
318b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
318c0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
318d0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
318e0 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
318f0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
31900 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
31910 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
31920 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
31930 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
31940 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
31950 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20  , pCell, &rc);. 
31960 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
31970 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
31980 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
31990 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
319a0 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
319b0 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
319c0 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
319d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
319e0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
319f0 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
31a00 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
31a10 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
31a20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
31a30 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
31a40 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
31a50 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
31a60 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
31a70 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
31a80 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
31a90 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
31aa0 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
31ab0 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
31ac0 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
31ad0 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
31ae0 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
31af0 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
31b00 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
31b10 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
31b20 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
31b30 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
31b40 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
31b50 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
31b60 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
31b70 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
31b80 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
31b90 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
31ba0 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
31bb0 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
31bc0 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
31bd0 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
31be0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
31bf0 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
31c00 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
31c10 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
31c20 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
31c30 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  into the pSpace 
31c40 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
31c50 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
31c60 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
31c70 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
31c80 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
31c90 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
31ca0 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
31cb0 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
31cc0 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
31cd0 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
31ce0 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
31cf0 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
31d00 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
31d10 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
31d20 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
31d30 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
31d40 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  Parent. */.    i
31d50 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
31d60 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  t, pParent->nCel
31d70 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29  l, pSpace, (int)
31d80 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20  (pOut-pSpace),. 
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
31da0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72   pPage->pgno, &r
31db0 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  c);..    /* Set 
31dc0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
31dd0 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65  pointer of pPare
31de0 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nt to point to t
31df0 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
31e00 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
31e10 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
31e20 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
31e30 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20  8], pgnoNew);.  
31e40 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
31e50 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
31e60 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
31e70 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
31e80 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
31e90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
31ea0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
31eb0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
31ec0 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  */..#if 0./*.** 
31ed0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
31ee0 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
31ef0 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  e anything to th
31f00 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53  e operation of S
31f10 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20  QLite..** it is 
31f20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61  sometimes activa
31f30 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  ted temporarily 
31f40 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20  while debugging 
31f50 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65  code responsible
31f60 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67   .** for setting
31f70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31f80 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
31f90 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50  int ptrmapCheckP
31fa0 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61  ages(MemPage **a
31fb0 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65  pPage, int nPage
31fc0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
31fd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67   for(i=0; i<nPag
31fe0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e  e; i++){.    Pgn
31ff0 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20  o n;.    u8 e;. 
32000 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
32010 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20  e = apPage[i];. 
32020 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
32030 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
32040 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32050 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20  ->isInit );..   
32060 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67   for(j=0; j<pPag
32070 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a  e->nCell; j++){.
32080 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
32090 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a  nfo;.      u8 *z
320a0 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20  ;.     .      z 
320b0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
320c0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65  , j);.      btre
320d0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
320e0 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a  age, z, &info);.
320f0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
32100 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
32110 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
32120 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f  get4byte(&z[info
32130 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
32140 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
32150 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26  pBt, ovfl, &e, &
32160 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
32170 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
32180 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
32190 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20  OVERFLOW1 );.   
321a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
321b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
321c0 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c         Pgno chil
321d0 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b  d = get4byte(z);
321e0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
321f0 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
32200 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
32210 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
32220 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
32230 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
32240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
32250 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
32260 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
32270 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
32280 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
32290 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
322a0 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47  );.      ptrmapG
322b0 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
322c0 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73  e, &n);.      as
322d0 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
322e0 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
322f0 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d  P_BTREE );.    }
32300 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
32310 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
32320 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
32330 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74  s used to copy t
32340 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
32350 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73  he b-tree node s
32360 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67  tored .** on pag
32370 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
32380 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72  pTo. If page pFr
32390 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61  om was not a lea
323a0 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20  f page, then.** 
323b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
323c0 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
323d0 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20   child page are 
323e0 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
323f0 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61  the.** parent pa
32400 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ge stored in the
32410 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
32420 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72  page pTo. If pFr
32430 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  om contained.** 
32440 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f  any cells with o
32450 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
32460 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  nters, then the 
32470 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
32480 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
32490 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70  ries are also up
324a0 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
324b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
324c0 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a   page pTo..**.**
324d0 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72   If pFrom is cur
324e0 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20  rently carrying 
324f0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
32500 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74  ls (entries in t
32510 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70  he.** MemPage.ap
32520 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74  Ovfl[] array), t
32530 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69  hey are not copi
32540 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a  ed to pTo. .**.*
32550 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
32560 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20  ng, page pTo is 
32570 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73  reinitialized us
32580 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67  ing btreeInitPag
32590 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  e()..**.** The p
325a0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68  erformance of th
325b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
325c0 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20  ot critical. It 
325d0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
325e0 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f  .** the balance_
325f0 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20  shallower() and 
32600 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
32610 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69   procedures, nei
32620 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68  ther of.** which
32630 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65   are called ofte
32640 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63  n under normal c
32650 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f  ircumstances..*/
32660 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70  .static void cop
32670 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d  yNodeContent(Mem
32680 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d  Page *pFrom, Mem
32690 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a  Page *pTo, int *
326a0 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
326b0 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
326c0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20  .    BtShared * 
326d0 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f  const pBt = pFro
326e0 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a  m->pBt;.    u8 *
326f0 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70   const aFrom = p
32700 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20  From->aData;.   
32710 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20   u8 * const aTo 
32720 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20  = pTo->aData;.  
32730 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f    int const iFro
32740 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64  mHdr = pFrom->hd
32750 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74  rOffset;.    int
32760 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20   const iToHdr = 
32770 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20  ((pTo->pgno==1) 
32780 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20  ? 100 : 0);.    
32790 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
327a0 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20  iData;.  .  .   
327b0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
327c0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73  isInit );.    as
327d0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72  sert( pFrom->nFr
327e0 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20  ee>=iToHdr );.  
327f0 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
32800 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
32810 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70  dr+5]) <= (int)p
32820 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
32830 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
32840 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
32850 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61   content from pa
32860 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65  ge pFrom to page
32870 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61   pTo. */.    iDa
32880 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ta = get2byte(&a
32890 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
328a0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
328b0 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f  To[iData], &aFro
328c0 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75  m[iData], pBt->u
328d0 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29  sableSize-iData)
328e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
328f0 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f  o[iToHdr], &aFro
32900 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72  m[iFromHdr], pFr
32910 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  om->cellOffset +
32920 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29   2*pFrom->nCell)
32930 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e  ;.  .    /* Rein
32940 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54  itialize page pT
32950 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  o so that the co
32960 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65  ntents of the Me
32970 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a  mPage structure.
32980 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65      ** match the
32990 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69   new data. The i
329a0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
329b0 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c   pTo can actuall
329c0 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20  y fail under.   
329d0 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75   ** fairly obscu
329e0 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  re circumstances
329f0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
32a00 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e   is a copy of in
32a10 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
32a20 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20  * page pFrom..  
32a30 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73    */.    pTo->is
32a40 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63  Init = 0;.    rc
32a50 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
32a60 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  (pTo);.    if( r
32a70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32a80 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
32a90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
32aa0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
32ab0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
32ac0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
32ad0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
32ae0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
32af0 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79  s.    ** for any
32b00 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66   b-tree or overf
32b10 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70  low pages that p
32b20 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  To now contains 
32b30 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e  the pointers to.
32b40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32b50 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
32b60 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74        *pRC = set
32b70 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f  ChildPtrmaps(pTo
32b80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
32b90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
32ba0 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
32bb0 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50   cells on the iP
32bc0 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c  arentIdx'th chil
32bd0 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20  d of pParent.** 
32be0 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20  (hereafter "the 
32bf0 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f  page") and up to
32c00 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74   2 siblings so t
32c10 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
32c20 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20  ve about the.** 
32c30 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
32c40 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c  ree space. Usual
32c50 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c  ly a single sibl
32c60 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ing on either si
32c70 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  de of the.** pag
32c80 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  e are used in th
32c90 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f  e balancing, tho
32ca0 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67  ugh both sibling
32cb0 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f  s might come fro
32cc0 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66  m one.** side if
32cd0 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65   the page is the
32ce0 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63   first or last c
32cf0 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
32d00 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  nt. If the page 
32d10 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68  .** has fewer th
32d20 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73  an 2 siblings (s
32d30 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
32d40 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
32d50 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  f the page.** is
32d60 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20   a root page or 
32d70 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f  a child of a roo
32d80 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c  t page) then all
32d90 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
32da0 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61  ngs.** participa
32db0 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
32dc0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
32dd0 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
32de0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69  s of the page mi
32df0 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
32e00 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
32e10 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20   .** one or two 
32e20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
32e30 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
32e40 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
32e50 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a  ver full. .**.**
32e60 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
32e70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
32e80 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
32e90 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  the cells on the
32ea0 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e   page.** might n
32eb0 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
32ec0 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65  tored in MemPage
32ed0 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63  .aData[]. This c
32ee0 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
32ef0 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
32f00 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69  full. This routi
32f10 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
32f20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61  all cells alloca
32f30 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ted.** to the pa
32f40 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
32f50 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d  ngs fit into Mem
32f60 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66  Page.aData[] bef
32f70 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
32f80 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72  *.** In the cour
32f90 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20  se of balancing 
32fa0 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73  the page and its
32fb0 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73   siblings, cells
32fc0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72   may be.** inser
32fd0 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f  ted into or remo
32fe0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ved from the par
32ff0 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e  ent page (pParen
33000 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20  t). Doing so.** 
33010 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61  may cause the pa
33020 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63  rent page to bec
33030 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
33040 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68  underfull. If th
33050 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69  is.** happens, i
33060 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
33070 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
33080 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20  aller to invoke 
33090 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62  the correct.** b
330a0 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
330b0 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f   to fix this pro
330c0 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61  blem (see the ba
330d0 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29  lance() routine)
330e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  . .**.** If this
330f0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
33100 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
33110 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
33120 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
33130 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
33140 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72  te. So if this r
33150 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
33160 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
33170 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
33180 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ack..**.** The t
33190 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
331a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
331b0 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61  aOvflSpace, is a
331c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a   pointer to a.**
331d0 20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75   buffer big enou
331e0 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70  gh to hold one p
331f0 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e  age. If while in
33200 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e  serting cells in
33210 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a  to the parent.**
33220 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20   page (pParent) 
33230 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
33240 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c  becomes overfull
33250 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73  , this buffer is
33260 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
33270 65 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f  e the parent's o
33280 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42  verflow cells. B
33290 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
332a0 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20  tion inserts.** 
332b0 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75  a maximum of fou
332c0 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  r divider cells 
332d0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
332e0 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61  page, and the ma
332f0 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66  ximum.** size of
33300 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77   a cell stored w
33310 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61  ithin an interna
33320 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  l node is always
33330 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a   less than 1/4.*
33340 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  * of the page-si
33350 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61  ze, the aOvflSpa
33360 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67  ce[] buffer is g
33370 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
33380 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20  large.** enough 
33390 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77  for all overflow
333a0 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   cells..**.** If
333b0 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73   aOvflSpace is s
333c0 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69  et to a null poi
333d0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
333e0 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
333f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
33400 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
33410 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
33420 45 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65  ER >= 1700 && de
33430 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70  fined(_M_ARM).#p
33440 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22  ragma optimize("
33450 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73  ", off).#endif.s
33460 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
33470 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d  e_nonroot(.  Mem
33480 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
33490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
334a0 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73  Parent page of s
334b0 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61  iblings being ba
334c0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
334d0 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20  iParentIdx,     
334e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
334f0 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67  ndex of "the pag
33500 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  e" in pParent */
33510 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63  .  u8 *aOvflSpac
33520 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
33530 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20     /* page-size 
33540 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
33550 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a  or parent ovfl *
33560 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20  /.  int isRoot, 
33570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33580 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
33590 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74  Parent is a root
335a0 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62  -page */.  int b
335b0 42 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20 20  Bulk            
335c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
335d0 75 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ue if this call 
335e0 69 73 20 70 61 72 74 20 6f 66 20 61 20 62 75 6c  is part of a bul
335f0 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42  k load */.){.  B
33600 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
33610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
33620 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
33630 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
33640 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33650 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33660 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
33670 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
33680 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
33690 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
336a0 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
336b0 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
336c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
336d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
336e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
336f0 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
33700 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33720 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33730 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
33740 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
33750 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
33760 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
33770 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
33780 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
33790 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
337a0 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
337b0 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
337c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
337d0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
337e0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
337f0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
33800 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
33810 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
33820 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
33830 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
33840 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
33850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
33860 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
33870 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
33880 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
33890 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
338a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
338b0 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
338c0 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
338d0 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
338e0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
338f0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
33900 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
33910 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
33920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33930 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
33940 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
33950 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
33960 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
33970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
33980 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
33990 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
339a0 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
339b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
339c0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
339d0 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
339e0 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
339f0 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
33a00 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
33a10 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
33a20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
33a30 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
33a40 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
33a50 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
33a60 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
33a70 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
33a80 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
33a90 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
33aa0 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
33ab0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
33ac0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
33ad0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
33ae0 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
33af0 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
33b00 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
33b10 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
33b20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
33b30 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
33b40 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
33b50 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
33b60 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
33b70 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
33b80 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
33b90 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
33ba0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
33bb0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
33bc0 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
33bd0 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
33be0 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
33bf0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
33c00 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
33c10 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
33c20 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
33c30 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
33c40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
33c50 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
33c60 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
33c70 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
33c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33c90 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
33ca0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
33cb0 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
33cc0 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
33cd0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
33ce0 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
33cf0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
33d00 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
33d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d20 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
33d30 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
33d40 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
33d50 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
33d60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33d70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
33d80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
33d90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
33da0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33db0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
33dc0 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
33dd0 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
33de0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
33df0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
33e00 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
33e10 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
33e20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
33e30 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
33e40 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
33e50 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
33e60 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
33e70 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
33e80 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
33e90 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
33ea0 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
33eb0 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
33ec0 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
33ed0 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
33ee0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
33ef0 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
33f00 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
33f10 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20  BtreeDelete().. 
33f20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
33f30 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
33f40 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
33f50 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
33f60 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
33f70 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
33f80 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76  || pParent->aiOv
33f90 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64  fl[0]==iParentId
33fa0 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
33fb0 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
33fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33fd0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
33fe0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
33ff0 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
34000 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
34010 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
34020 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
34030 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
34040 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
34050 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
34060 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
34070 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
34080 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
34090 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
340a0 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
340b0 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
340c0 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
340d0 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
340e0 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
340f0 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
34100 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
34110 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
34120 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
34130 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
34140 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
34150 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
34160 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
34170 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
34180 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
34190 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
341a0 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
341b0 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
341c0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
341d0 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
341e0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
341f0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
34200 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20  e, since if any 
34210 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c  existed they wil
34220 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65  l.  ** have alre
34230 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ady been removed
34240 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61  ..  */.  i = pPa
34250 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
34260 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  + pParent->nCell
34270 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  ;.  if( i<2 ){. 
34280 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
34290 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
342a0 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62  t( bBulk==0 || b
342b0 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69  Bulk==1 );.    i
342c0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30  f( iParentIdx==0
342d0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
342e0 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76      .      nxDiv
342f0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
34300 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
34310 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  i ){.      nxDiv
34320 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20   = i-2+bBulk;.  
34330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
34340 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20  ssert( bBulk==0 
34350 29 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d  );.      nxDiv =
34360 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20   iParentIdx-1;. 
34370 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62     }.    i = 2-b
34380 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64  Bulk;.  }.  nOld
34390 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28 69   = i+1;.  if( (i
343a0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
343b0 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72  nOverflow)==pPar
343c0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
343d0 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72    pRight = &pPar
343e0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
343f0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
34400 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
34410 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c  Right = findCell
34420 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
34430 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
34440 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e  flow);.  }.  pgn
34450 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69  o = get4byte(pRi
34460 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  ght);.  while( 1
34470 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   ){.    rc = get
34480 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
34490 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d   pgno, &apOld[i]
344a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
344b0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
344c0 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29  (apOld, 0, (i+1)
344d0 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a  *sizeof(MemPage*
344e0 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  ));.      goto b
344f0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
34500 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65      }.    nMaxCe
34510 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
34520 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
34530 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
34540 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29    if( (i--)==0 )
34550 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28   break;..    if(
34560 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e   i+nxDiv==pParen
34570 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20  t->aiOvfl[0] && 
34580 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
34590 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  ow ){.      apDi
345a0 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e  v[i] = pParent->
345b0 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20  apOvfl[0];.     
345c0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
345d0 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
345e0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
345f0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
34600 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
34610 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65     pParent->nOve
34620 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  rflow = 0;.    }
34630 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69  else{.      apDi
34640 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
34650 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
34660 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
34670 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  low);.      pgno
34680 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
34690 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
346a0 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
346b0 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
346c0 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  iv[i]);..      /
346d0 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20  * Drop the cell 
346e0 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
346f0 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73  page. apDiv[i] s
34700 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20  till points to. 
34710 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c       ** the cell
34720 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65   within the pare
34730 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  nt, even though 
34740 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70  it has been drop
34750 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ped..      ** Th
34760 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
34770 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65  se dropping a ce
34780 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74  ll only overwrit
34790 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  es the first.   
347a0 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
347b0 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73   of it, and this
347c0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
347d0 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73  ot need the firs
347e0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
347f0 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76  bytes of the div
34800 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68  ider cell. So th
34810 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66  e pointer is saf
34820 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a  e to use.      *
34830 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20  * later on.  .  
34840 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
34850 42 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61 72  But not if we ar
34860 65 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65  e in secure-dele
34870 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75  te mode. In secu
34880 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a  re-delete mode,.
34890 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f        ** the dro
348a0 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20  pCell() routine 
348b0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
348c0 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77  he entire cell w
348d0 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20  ith zeroes..    
348e0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
348f0 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63  e, temporarily c
34900 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74  opy the cell int
34910 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  o the aOvflSpace
34920 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66  [].      ** buff
34930 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63  er. It will be c
34940 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20  opied out again 
34950 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61  as soon as the a
34960 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20  Space[] buffer. 
34970 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63       ** is alloc
34980 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ated.  */.      
34990 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
349a0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
349b0 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20  ELETE ){.       
349c0 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20   int iOff;..    
349d0 20 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49 54      iOff = SQLIT
349e0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44  E_PTR_TO_INT(apD
349f0 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f  iv[i]) - SQLITE_
34a00 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65  PTR_TO_INT(pPare
34a10 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nt->aData);.    
34a20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a      if( (iOff+sz
34a30 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74  New[i])>(int)pBt
34a40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
34a50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
34a60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34a70 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  PT;.          me
34a80 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
34a90 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
34aa0 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20  age*));.        
34ab0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
34ac0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
34ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34ae0 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70   memcpy(&aOvflSp
34af0 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76  ace[iOff], apDiv
34b00 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a  [i], szNew[i]);.
34b10 20 20 20 20 20 20 20 20 20 20 61 70 44 69 76 5b            apDiv[
34b20 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  i] = &aOvflSpace
34b30 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e  [apDiv[i]-pParen
34b40 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20  t->aData];.     
34b50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34b60 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
34b70 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
34b80 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c  rent->nOverflow,
34b90 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b   szNew[i], &rc);
34ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
34bb0 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
34bc0 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
34bd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
34be0 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
34bf0 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
34c00 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
34c10 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
34c20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
34c30 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
34c40 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
34c50 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e    */.  k = pBt->
34c60 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44  pageSize + ROUND
34c70 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
34c80 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20  ));.  szScratch 
34c90 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
34ca0 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
34cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cc0 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
34cd0 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
34ce0 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
34cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d00 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
34d10 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
34d20 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  geSize          
34d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d40 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20       /* aSpace1 
34d50 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64  */.     + k*nOld
34d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d80 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
34d90 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f  pies (apCopy) */
34da0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
34db0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
34dc0 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
34dd0 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
34de0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
34df0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
34e00 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
34e10 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
34e20 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
34e30 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
34e40 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73  Space1 = (u8*)&s
34e50 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
34e60 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
34e70 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
34e80 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20  (aSpace1) );..  
34e90 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
34ea0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
34eb0 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
34ec0 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
34ed0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
34ee0 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
34ef0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
34f00 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
34f10 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
34f20 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
34f30 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53  obtained from aS
34f40 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
34f50 76 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ve the divider c
34f60 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
34f70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
34f80 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
34f90 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
34fa0 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
34fb0 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
34fc0 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
34fd0 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
34fe0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
34ff0 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
35000 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
35010 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20  nto aSpace1[].  
35020 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
35030 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
35040 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
35050 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
35060 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
35070 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
35080 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
35090 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
350a0 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
350b0 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
350c0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
350d0 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
350e0 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
350f0 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
35100 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
35110 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
35120 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
35130 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
35140 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
35150 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
35160 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
35170 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
35180 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43  ys..  */.  leafC
35190 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c  orrection = apOl
351a0 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  d[0]->leaf*4;.  
351b0 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64  leafData = apOld
351c0 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  [0]->hasData;.  
351d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
351e0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
351f0 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f  imit;.    .    /
35200 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
35210 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61  nything else, ta
35220 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
35230 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73   i'th original s
35240 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68  ibling.    ** Th
35250 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
35260 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
35270 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
35280 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20  opies rather.   
35290 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
352a0 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
352b0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
352c0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
352d0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
352e0 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72  ss of being over
352f0 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
35300 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
35310 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
35320 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b  mPage*)&aSpace1[
35330 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
35340 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  k*i];.    memcpy
35350 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c  (pOld, apOld[i],
35360 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
35370 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61  );.    pOld->aDa
35380 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c  ta = (void*)&pOl
35390 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d[1];.    memcpy
353a0 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70  (pOld->aData, ap
353b0 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
353c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
353d0 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64      limit = pOld
353e0 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
353f0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
35400 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
35410 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  >0 ){.      for(
35420 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
35430 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
35440 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
35450 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61  lls );.        a
35460 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
35470 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
35480 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
35490 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
354a0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
354b0 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
354c0 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  ]);.        nCel
354d0 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
354e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
354f0 20 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e   *aData = pOld->
35500 61 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36  aData;.      u16
35510 20 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64   maskPage = pOld
35520 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20  ->maskPage;.    
35530 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
35540 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66   = pOld->cellOff
35550 73 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  set;.      for(j
35560 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
35570 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
35580 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
35590 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
355a0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
355b0 6e 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20  ndCellv2(aData, 
355c0 6d 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66  maskPage, cellOf
355d0 66 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20  fset, j);.      
355e0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
355f0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
35600 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
35610 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  ]);.        nCel
35620 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
35630 20 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66   }       .    if
35640 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c  ( i<nOld-1 && !l
35650 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20  eafData){.      
35660 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a  u16 sz = (u16)sz
35670 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38  New[i];.      u8
35680 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61   *pTemp;.      a
35690 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
356a0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
356b0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
356c0 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  sz;.      pTemp 
356d0 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
356e0 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63  e1];.      iSpac
356f0 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e1 += sz;.      
35700 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
35710 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
35720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
35730 70 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42  pace1 <= (int)pB
35740 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
35750 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
35760 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
35770 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
35780 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
35790 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
357a0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
357b0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c  Correction==0 ||
357c0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
357d0 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  =4 );.      szCe
357e0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65  ll[nCell] = szCe
357f0 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66  ll[nCell] - leaf
35800 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
35810 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
35820 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  f ){.        ass
35830 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
35840 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
35850 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e    assert( pOld->
35860 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  hdrOffset==0 );.
35870 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
35880 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
35890 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
358a0 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
358b0 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  left.        ** 
358c0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
358d0 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
358e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
358f0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
35900 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  ld->aData[8], 4)
35910 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35920 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
35930 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
35940 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
35950 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
35960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
35970 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
35980 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
35990 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
359a0 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
359b0 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
359c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
359d0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
359e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
359f0 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
35a00 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
35a10 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
35a20 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
35a30 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
35a40 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
35a50 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
35a60 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
35a70 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
35a80 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
35a90 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
35aa0 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
35ab0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
35ac0 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
35ad0 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
35ae0 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
35af0 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
35b00 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
35b10 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
35b20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
35b30 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
35b40 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
35b50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
35b60 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
35b70 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
35b80 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
35b90 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
35ba0 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
35bb0 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
35bc0 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
35bd0 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
35be0 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
35bf0 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
35c00 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
35c10 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
35c20 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
35c30 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
35c40 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
35c50 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
35c60 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
35c70 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
35c80 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
35c90 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
35ca0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
35cb0 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
35cc0 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
35cd0 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
35ce0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
35cf0 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
35d00 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
35d10 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
35d20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
35d30 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
35d40 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
35d50 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
35d60 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
35d70 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
35d80 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
35d90 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
35da0 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
35db0 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
35dc0 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20       if( k>NB+1 
35dd0 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  ){ rc = SQLITE_C
35de0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74  ORRUPT_BKPT; got
35df0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
35e00 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p; }.    }.  }. 
35e10 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
35e20 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
35e30 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
35e40 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
35e50 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
35e60 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
35e70 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
35e80 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
35e90 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
35ea0 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
35eb0 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
35ec0 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
35ed0 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
35ee0 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
35ef0 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
35f00 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
35f10 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
35f20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
35f30 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
35f40 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
35f50 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
35f60 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
35f70 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
35f80 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
35f90 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
35fa0 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
35fb0 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
35fc0 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
35fd0 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
35fe0 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
35ff0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
36000 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
36010 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
36020 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
36030 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
36040 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
36050 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
36060 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
36070 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
36080 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
36090 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
360a0 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
360b0 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
360c0 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
360d0 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
360e0 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
360f0 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
36100 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
36110 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
36120 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
36130 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
36140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36150 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
36160 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
36170 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
36180 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
36190 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
361a0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
361b0 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
361c0 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
361d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
361e0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
361f0 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
36200 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  ==0 .       || (
36210 21 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67 68  !bBulk && szRigh
36220 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73  t+szCell[d]+2<=s
36230 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d  zLeft-(szCell[r]
36240 2b 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  +2)) .    ){.   
36250 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
36260 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
36270 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
36280 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
36290 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
362a0 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
362b0 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
362c0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
362d0 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
362e0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
362f0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
36300 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
36310 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
36320 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
36330 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
36340 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
36350 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
36360 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
36370 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
36380 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
36390 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
363a0 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
363b0 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
363c0 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
363d0 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   page..  **.  **
363e0 20 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73   UPDATE:  The as
363f0 73 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20  sert() below is 
36400 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
36410 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
36420 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69  base.  ** file i
36430 73 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20  s corrupt.  The 
36440 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
36450 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20  be detected and 
36460 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20  reported later. 
36470 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63   ** in this proc
36480 65 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69  edure so there i
36490 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74  s no need to act
364a0 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20   upon it now..  
364b0 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
364c0 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
364d0 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
364e0 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
364f0 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e  nCell==0) );.#en
36500 64 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42  dif..  TRACE(("B
36510 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
36520 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70  %d %d  ",.    ap
36530 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20  Old[0]->pgno, . 
36540 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f     nOld>=2 ? apO
36550 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ld[1]->pgno : 0,
36560 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61  .    nOld>=3 ? a
36570 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[2]->pgno : 
36580 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0.  ));..  /*.  
36590 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
365a0 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
365b0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
365c0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
365d0 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70   if( apOld[0]->p
365e0 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63  gno<=1 ){.    rc
365f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
36600 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
36610 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
36620 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67  ;.  }.  pageFlag
36630 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44  s = apOld[0]->aD
36640 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
36650 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
36660 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
36670 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
36680 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
36690 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
366a0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
366b0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
366c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
366d0 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
366e0 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
366f0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
36700 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
36710 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
36720 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
36730 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
36740 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
36750 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
36760 2c 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20  , &pgno, (bBulk 
36770 3f 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b  ? 1 : pgno), 0);
36780 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36790 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
367a0 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
367b0 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
367c0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20     nNew++;..    
367d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69    /* Set the poi
367e0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
367f0 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  or the new sibli
36800 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
36810 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
36820 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  UM ){.        pt
36830 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
36840 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
36850 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
36860 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
36870 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36890 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
368a0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
368b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
368c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
368d0 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
368e0 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
368f0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
36900 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
36910 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65  <nOld ){.    fre
36920 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20  ePage(apOld[i], 
36930 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
36940 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
36950 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
36960 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
36970 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
36980 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
36990 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
369a0 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
369b0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
369c0 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
369d0 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
369e0 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
369f0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
36a00 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
36a10 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
36a20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
36a30 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
36a40 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
36a50 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
36a60 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
36a70 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
36a80 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
36a90 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
36aa0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
36ab0 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
36ac0 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
36ad0 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
36ae0 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
36af0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
36b00 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
36b10 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
36b20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
36b30 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
36b40 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
36b50 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
36b60 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
36b70 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
36b80 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
36b90 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
36ba0 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
36bb0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
36bc0 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
36bd0 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65   int minV = apNe
36be0 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[i]->pgno;.    
36bf0 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
36c00 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
36c10 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
36c20 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  ( apNew[j]->pgno
36c30 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
36c40 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
36c50 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
36c60 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  V = apNew[j]->pg
36c70 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
36c80 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
36c90 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
36ca0 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20  e *pT;.      pT 
36cb0 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
36cc0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
36cd0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
36ce0 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
36cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
36d00 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64  ACE(("new: %d(%d
36d10 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
36d20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
36d30 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e  ,.    apNew[0]->
36d40 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  pgno, szNew[0],.
36d50 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70      nNew>=2 ? ap
36d60 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[1]->pgno : 0
36d70 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
36d80 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
36d90 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d  ew>=3 ? apNew[2]
36da0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
36db0 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
36dc0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
36dd0 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f  ? apNew[3]->pgno
36de0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
36df0 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
36e00 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65    nNew>=5 ? apNe
36e10 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[4]->pgno : 0, 
36e20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
36e30 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73  4] : 0));..  ass
36e40 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
36e50 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36e60 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
36e70 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69  ;.  put4byte(pRi
36e80 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  ght, apNew[nNew-
36e90 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  1]->pgno);..  /*
36ea0 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
36eb0 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
36ec0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
36ed0 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
36ee0 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
36ef0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
36f00 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
36f10 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
36f20 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
36f30 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
36f40 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
36f50 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
36f60 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
36f70 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
36f80 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
36f90 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
36fa0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
36fb0 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
36fc0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
36fd0 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
36fe0 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
36ff0 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
37000 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
37010 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
37020 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
37030 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
37040 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
37050 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20  ow==0 );..    j 
37060 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
37070 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
37080 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
37090 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
370a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
370b0 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
370c0 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
370d0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
370e0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
370f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
37100 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43  <nNew-1 || j==nC
37110 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ell );.    if( j
37120 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  <nCell ){.      
37130 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
37140 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
37150 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20    int sz;..     
37160 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
37170 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43  ells );.      pC
37180 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b  ell = apCell[j];
37190 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65  .      sz = szCe
371a0 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72  ll[j] + leafCorr
371b0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54  ection;.      pT
371c0 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  emp = &aOvflSpac
371d0 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20  e[iOvflSpace];. 
371e0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
371f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
37200 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
37210 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
37220 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
37230 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
37240 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
37250 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
37260 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
37270 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
37280 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
37290 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
372a0 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
372b0 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
372c0 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
372d0 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
372e0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
372f0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
37300 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
37310 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
37320 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
37330 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
37340 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
37350 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
37360 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
37370 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
37380 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
37390 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
373a0 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
373b0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
373c0 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   pTemp;.        
373d0 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69  sz = 4 + putVari
373e0 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e  nt(&pCell[4], in
373f0 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  fo.nKey);.      
37400 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
37410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37420 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
37430 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
37440 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
37450 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
37460 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
37470 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
37480 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
37490 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
374a0 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70  ode, and its rep
374b0 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34  orted size was 4
374c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
374d0 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61  s, then it may a
374e0 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c  ctually be small
374f0 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20  er than this .  
37500 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74        ** (see bt
37510 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
37520 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
37530 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
37540 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
37550 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
37560 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
37570 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
37580 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
37590 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
375a0 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
375b0 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
375c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
375d0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
375e0 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
375f0 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
37600 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
37610 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
37620 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
37630 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
37640 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
37650 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
37660 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
37670 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
37680 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
37690 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
376a0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
376b0 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
376c0 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
376d0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
376e0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
376f0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
37700 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
37710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37720 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20       iOvflSpace 
37730 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
37740 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61  ert( sz<=pBt->ma
37750 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20  xLocal+23 );.   
37760 20 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c     assert( iOvfl
37770 53 70 61 63 65 20 3c 3d 20 28 69 6e 74 29 70 42  Space <= (int)pB
37780 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
37790 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28       insertCell(
377a0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
377b0 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
377c0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
377d0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
377e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
377f0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
37800 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  up;.      assert
37810 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
37820 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
37830 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
37840 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
37850 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a   nxDiv++;.    }.
37860 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
37870 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  =nCell );.  asse
37880 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20  rt( nOld>0 );.  
37890 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
378a0 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61  ;.  if( (pageFla
378b0 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d  gs & PTF_LEAF)==
378c0 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68  0 ){.    u8 *zCh
378d0 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f  ild = &apCopy[nO
378e0 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b  ld-1]->aData[8];
378f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
37900 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
37910 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29  a[8], zChild, 4)
37920 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
37930 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  oot && pParent->
37940 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72  nCell==0 && pPar
37950 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d  ent->hdrOffset<=
37960 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
37970 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  ){.    /* The ro
37980 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
37990 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -tree now contai
379a0 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65  ns no cells. The
379b0 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20   only sibling.  
379c0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65    ** page is the
379d0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
379e0 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79  the parent. Copy
379f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
37a00 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c   the.    ** chil
37a10 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  d page into the 
37a20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69  parent, decreasi
37a30 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68  ng the overall h
37a40 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20  eight of the.   
37a50 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63   ** b-tree struc
37a60 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69  ture by one. Thi
37a70 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61  s is described a
37a80 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73  s the "balance-s
37a90 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a  hallower".    **
37aa0 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69   sub-algorithm i
37ab0 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61  n some documenta
37ac0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tion..    **.   
37ad0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
37ae0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
37af0 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c  tabase, the call
37b00 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74   to copyNodeCont
37b10 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65  ent() .    ** se
37b20 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  ts all pointer-m
37b30 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
37b40 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61  sponding to data
37b50 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73  base image pages
37b60 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69   .    ** for whi
37b70 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  ch the pointer i
37b80 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  s stored within 
37b90 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  the content bein
37ba0 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a  g copied..    **
37bb0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
37bc0 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20  nd assert below 
37bd0 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
37be0 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20  e child page is 
37bf0 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20  defragmented.   
37c00 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c   ** (it must be,
37c10 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20   as it was just 
37c20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73  reconstructed us
37c30 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ing assemblePage
37c40 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  ()). This.    **
37c50 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66   is important if
37c60 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
37c70 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70   happens to be p
37c80 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
37c90 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61  abase.    ** ima
37ca0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ge.  */.    asse
37cb0 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20  rt( nNew==1 );. 
37cc0 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77     assert( apNew
37cd0 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20  [0]->nFree == . 
37ce0 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65         (get2byte
37cf0 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74  (&apNew[0]->aDat
37d00 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e  a[5])-apNew[0]->
37d10 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77  cellOffset-apNew
37d20 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20  [0]->nCell*2) . 
37d30 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f     );.    copyNo
37d40 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b  deContent(apNew[
37d50 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63  0], pParent, &rc
37d60 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  );.    freePage(
37d70 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a  apNew[0], &rc);.
37d80 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55    }else if( ISAU
37d90 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
37da0 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74  /* Fix the point
37db0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
37dc0 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  or all the cells
37dd0 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74   that were shift
37de0 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20  ed around. .    
37df0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76  ** There are sev
37e00 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74  eral different t
37e10 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d  ypes of pointer-
37e20 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74  map entries that
37e30 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20   need to.    ** 
37e40 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
37e50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53   this routine. S
37e60 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76  ome of these hav
37e70 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61  e been set alrea
37e80 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d  dy, but.    ** m
37e90 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68  any have not. Th
37ea0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
37eb0 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a   summary:.    **
37ec0 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65  .    **   1) The
37ed0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
37ee0 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62  ted with new sib
37ef0 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20  ling pages that 
37f00 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  were not.    ** 
37f10 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68       siblings wh
37f20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
37f30 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65   was called. The
37f40 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  se have already.
37f50 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e      **      been
37f60 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e   set. We don't n
37f70 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  eed to worry abo
37f80 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20  ut old siblings 
37f90 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a  that were.    **
37fa0 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74        moved to t
37fb0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74  he free-list - t
37fc0 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f  he freePage() co
37fd0 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72  de has taken car
37fe0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66  e.    **      of
37ff0 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20   those..    **. 
38000 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70     **   2) The p
38010 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
38020 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
38030 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  th the first ove
38040 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20  rflow.    **    
38050 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76    page in any ov
38060 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73  erflow chains us
38070 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65  ed by new divide
38080 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a  r cells. These .
38090 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65      **      have
380a0 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65   also already be
380b0 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66  en taken care of
380c0 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65   by the insertCe
380d0 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a  ll() code..    *
380e0 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66  *.    **   3) If
380f0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
38100 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
38110 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
38120 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a  d pages of.    *
38130 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f  *      cells sto
38140 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69  red on the sibli
38150 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65  ng pages may nee
38160 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
38170 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
38180 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   4) If the sibli
38190 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
381a0 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79   internal intkey
381b0 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79   nodes, then any
381c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65  .    **      ove
381d0 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64  rflow pages used
381e0 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20   by these cells 
381f0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
38200 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20  pdated.    **   
38210 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74     (internal int
38220 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20  key nodes never 
38230 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
38240 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
38250 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  es)..    **.    
38260 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73  **   5) If the s
38270 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
38280 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
38290 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
382a0 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e  p.    **      en
382b0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69  tries for the ri
382c0 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20  ght-child pages 
382d0 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20  of each sibling 
382e0 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
382f0 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74       to be updat
38300 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
38310 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20  * Cases 1 and 2 
38320 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61  are dealt with a
38330 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f  bove by other co
38340 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20  de. The next.   
38350 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20   ** block deals 
38360 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64  with cases 3 and
38370 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61   4 and the one a
38380 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20  fter that, case 
38390 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  5. Since.    ** 
383a0 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
383b0 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61  r map entry is a
383c0 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65   relatively expe
383d0 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c  nsive operation,
383e0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64   this.    ** cod
383f0 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e  e only sets poin
38400 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
38410 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  for child or ove
38420 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
38430 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74   have.    ** act
38440 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77  ually moved betw
38450 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20  een pages.  */. 
38460 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
38470 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20   = apNew[0];.   
38480 20 4d