/ Hex Artifact Content
Login

Artifact dff8e7789730e835b66d81f9eb68de2352845012:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
3ac0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
3ad0: 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72  cache of the cur
3ae0: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
3af0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
3b00: 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  ..** on the shar
3b10: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3b20: 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69  re pBt..*/.#defi
3b30: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  ne invalidateOve
3b40: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
3b50: 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
3b60: 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
3b70: 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  vfl)../*.** Inva
3b80: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
3b90: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
3ba0: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
3bb0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
3bc0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3bd0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3bf0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
3c00: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
3c10: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
3c20: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
3c30: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3c40: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3c50: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3c60: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3c70: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3c80: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3c90: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3ca0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3cb0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3cc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3cd0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
3ce0: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
3cf0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
3d00: 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76   table.** to inv
3d10: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
3d20: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
3d30: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
3d40: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
3d50: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
3d60: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
3d70: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
3d80: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
3d90: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
3da0: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
3db0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
3dc0: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
3dd0: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
3de0: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
3df0: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
3e00: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
3e10: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
3e20: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
3e30: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
3e40: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
3e50: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
3e60: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
3e70: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
3e80: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
3e90: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
3ea0: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
3eb0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ec0: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
3ed0: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
3ee0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3ef0: 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f  that specific ro
3f00: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
3f10: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
3f20: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
3f30: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
3f40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
3f50: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
3f60: 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52  heck */.  i64 iR
3f70: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
3f80: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
3f90: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
3fa0: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
3fb0: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
3fc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
3fd0: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
3fe0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
3ff0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
4000: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
4010: 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61  pBtree->pBt;.  a
4020: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
4030: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
4040: 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
4050: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
4060: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4070: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
4080: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
4090: 6c 6f 62 29 21 3d 30 20 26 26 20 28 69 73 43 6c  lob)!=0 && (isCl
40a0: 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69  earTable || p->i
40b0: 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20  nfo.nKey==iRow) 
40c0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40e0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
40f0: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4100: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4110: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4120: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4130: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4140: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4150: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4160: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4170: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4180: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
4190: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41a0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41b0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41c0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41d0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41e0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
41f0: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4200: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4210: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4220: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4230: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4240: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4250: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4260: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4270: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4280: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
4290: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42a0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42b0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42c0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42d0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42e0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
42f0: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4300: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4310: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4320: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4330: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4340: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4350: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4360: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4370: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4380: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
4390: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43a0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43b0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43c0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43d0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43e0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
43f0: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4400: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4410: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4420: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4430: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4440: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4450: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4460: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4480: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
4490: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44a0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44b0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44c0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44d0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44e0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
44f0: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4500: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4510: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4520: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4530: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4540: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4550: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4560: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4570: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4580: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
4590: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45a0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45b0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45c0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45d0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45e0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
45f0: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4600: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4610: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4620: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4630: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4640: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4650: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4660: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4670: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4680: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
4690: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46a0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46b0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46c0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46d0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46e0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
46f0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4700: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4710: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4720: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4730: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4740: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4750: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4760: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4770: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4780: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
4790: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47a0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47b0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47c0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47d0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47e0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
47f0: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4800: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4810: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4820: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4830: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4840: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4850: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4860: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4870: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4880: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4890: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48b0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48c0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48e0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
48f0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4900: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4910: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4920: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4930: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4940: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4950: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4980: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4990: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49a0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49c0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49d0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
49f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4a90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4aa0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ab0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ac0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ad0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ae0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4af0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4b90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4ba0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bc0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4bd0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4be0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4bf0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4c90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4cd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4ce0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4cf0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d00: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d10: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d30: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d40: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d50: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d60: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d70: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d80: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4d90: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4da0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4db0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dc0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4dd0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4de0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4df0: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e00: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e10: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e20: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e30: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e40: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e50: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e60: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e70: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e80: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4e90: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4ea0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4eb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ec0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ed0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ee0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4ef0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f00: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f10: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f20: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f30: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f50: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f60: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f80: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4f90: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fa0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fb0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fc0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fd0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4fe0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
4ff0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5000: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5010: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5020: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5030: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5040: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5050: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5060: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5070: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5080: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
5090: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50a0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50b0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50c0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50d0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50e0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
50f0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5100: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5110: 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75  Malloc( (int)pCu
5120: 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69  r->nKey );.    i
5130: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
5140: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5150: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
5160: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
5170: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
5180: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5190: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
51a0: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
51b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
51c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
51d0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
51e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
51f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
5200: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5210: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50  sert( !pCur->apP
5220: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
5230: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
5240: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
5250: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
5260: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
5270: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
5280: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5290: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
52a0: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
52b0: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
52c0: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
52d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
52e0: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
52f0: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5300: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5310: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5320: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5330: 6c 65 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  le  with root-pa
5340: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
5350: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
5360: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
5370: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
5380: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5390: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
53a0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
53b0: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
53c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
53d0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
53e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
53f0: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5400: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5410: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5420: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5430: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5440: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5450: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5460: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5470: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5480: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5490: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
54a0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
54b0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
54c0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
54d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
54e0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
54f0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5500: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5510: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5520: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5530: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5550: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5570: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5580: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5590: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
55a0: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
55c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
55d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
55e0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
55f0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
5600: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5610: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5620: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5630: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5640: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5650: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
5660: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
5670: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
5680: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
5690: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
56a0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
56b0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
56c0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
56d0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
56e0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
56f0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
5700: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
5710: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5720: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5730: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5740: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5750: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
5760: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
5770: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
5780: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
5790: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
57a0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
57b0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
57c0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
57d0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
57e0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
57f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
5800: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5810: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5820: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5830: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5840: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5850: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5860: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5870: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5880: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5890: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
58a0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
58b0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
58c0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
58d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
58e0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
58f0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
5900: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5910: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5920: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5930: 63 68 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d  char aSpace[200]
5940: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5950: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5960: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5970: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  a malloc */.  ch
5980: 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *pFree = 0;..
5990: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
59a0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
59b0: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
59c0: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
59d0: 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
59e0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
59f0: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5a00: 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20  eyInfo, aSpace, 
5a10: 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20  sizeof(aSpace), 
5a20: 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20  &pFree.    );.  
5a30: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5a40: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5a50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
5a60: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
5a70: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
5a80: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
5a90: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
5aa0: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
5ab0: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
5ac0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5ad0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
5ae0: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  >db, pFree);.   
5af0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5b00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
5b10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5b20: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
5b30: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
5b40: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
5b50: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
5b60: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
5b70: 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72  pRes);.  if( pFr
5b80: 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
5b90: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
5ba0: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
5bb0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
5bc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
5bd0: 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
5be0: 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
5bf0: 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61   it was in (or a
5c00: 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f  s close to as po
5c10: 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20  ssible).** when 
5c20: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5c30: 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e  on() was called.
5c40: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
5c50: 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65  call deletes the
5c60: 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74   .** saved posit
5c70: 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20  ion info stored 
5c80: 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  by saveCursorPos
5c90: 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72  ition(), so ther
5ca0: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d  e can be.** at m
5cb0: 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76  ost one effectiv
5cc0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
5cd0: 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61  osition() call a
5ce0: 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61  fter each .** sa
5cf0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5d00: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
5d10: 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  t btreeRestoreCu
5d20: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5d40: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
5d50: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
5d60: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
5d70: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
5d80: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
5d90: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
5da0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
5db0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
5dc0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
5dd0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
5de0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5df0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
5e00: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
5e10: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
5e20: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
5e30: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  , &pCur->skipNex
5e40: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
5e50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5e60: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
5e70: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
5e80: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
5e90: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
5ea0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5eb0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
5ec0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
5ed0: 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
5ee0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26  Cur->skipNext &&
5ef0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5f00: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
5f10: 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
5f20: 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  e = CURSOR_SKIPN
5f30: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EXT;.    }.  }. 
5f40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
5f50: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
5f60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5f70: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
5f80: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5f90: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
5fa0: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
5fb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
5fc0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
5fd0: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
5fe0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
5ff0: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
6000: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
6010: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a  e position it.**
6020: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
6030: 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61   at.  Cursors ca
6040: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6050: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6060: 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64  nting.** at is d
6070: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
6080: 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  under them..**.*
6090: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
60a0: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
60b0: 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  code if somethin
60c0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54  g goes wrong.  T
60d0: 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70  he.** integer *p
60e0: 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20  HasMoved is set 
60f0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
6100: 2a 20 20 20 20 30 3a 20 20 20 54 68 65 20 63 75  *    0:   The cu
6110: 72 73 6f 72 20 69 73 20 75 6e 63 68 61 6e 67 65  rsor is unchange
6120: 64 0a 2a 2a 20 20 20 20 31 3a 20 20 20 54 68 65  d.**    1:   The
6130: 20 63 75 72 73 6f 72 20 69 73 20 73 74 69 6c 6c   cursor is still
6140: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
6150: 20 73 61 6d 65 20 72 6f 77 2c 20 62 75 74 20 74   same row, but t
6160: 68 65 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 20  he pointers.**  
6170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 65 64 20         returned 
6180: 62 79 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  by sqlite3BtreeK
6190: 65 79 46 65 74 63 68 28 29 20 6f 72 20 73 71 6c  eyFetch() or sql
61a0: 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
61b0: 63 68 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ch().**         
61c0: 6d 69 67 68 74 20 6e 6f 77 20 62 65 20 69 6e 76  might now be inv
61d0: 61 6c 69 64 20 62 65 63 61 75 73 65 20 6f 66 20  alid because of 
61e0: 61 20 62 61 6c 61 6e 63 65 28 29 20 6f 72 20 6f  a balance() or o
61f0: 74 68 65 72 20 63 68 61 6e 67 65 20 74 6f 20 74  ther change to t
6200: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 2d  he.**         b-
6210: 74 72 65 65 2e 0a 2a 2a 20 20 20 20 32 3a 20 20  tree..**    2:  
6220: 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
6230: 6f 20 6c 6f 6e 67 65 72 20 70 6f 69 6e 74 69 6e  o longer pointin
6240: 67 20 74 6f 20 74 68 65 20 72 6f 77 2e 20 20 54  g to the row.  T
6250: 68 65 20 72 6f 77 20 6d 69 67 68 74 20 68 61 76  he row might hav
6260: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 65 65  e.**         bee
6270: 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
6280: 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
6290: 73 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sor..*/.int sqli
62a0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
62b0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
62c0: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
62d0: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
62e0: 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ;..  if( pCur->e
62f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6300: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 48 61 73  LID ){.    *pHas
6310: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 72  Moved = 0;.    r
6320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6330: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 73 74  .  }.  rc = rest
6340: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6350: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
6360: 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  c ){.    *pHasMo
6370: 76 65 64 20 3d 20 32 3b 0a 20 20 20 20 72 65 74  ved = 2;.    ret
6380: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
6390: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
63a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
63b0: 4e 45 56 45 52 28 70 43 75 72 2d 3e 73 6b 69 70  NEVER(pCur->skip
63c0: 4e 65 78 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  Next!=0) ){.    
63d0: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 32 3b 0a  *pHasMoved = 2;.
63e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48    }else{.    *pH
63f0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
6400: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6410: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
6420: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6430: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
6440: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
6450: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
6460: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
6470: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
6480: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
6490: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
64a0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
64b0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
64c0: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
64d0: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mber..**.** Retu
64e0: 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69  rn 0 (not a vali
64f0: 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f  d page) for pgno
6500: 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20  ==1 since there 
6510: 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72  is.** no pointer
6520: 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20   map associated 
6530: 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68  with page 1.  Th
6540: 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  e integrity_chec
6550: 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69  k logic.** requi
6560: 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50  res that ptrmapP
6570: 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a  ageno(*,1)!=1..*
6580: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
6590: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
65a0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
65b0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
65c0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
65d0: 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65  Pgno iPtrMap, re
65e0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
65f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6600: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
6610: 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65   if( pgno<2 ) re
6620: 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73  turn 0;.  nPages
6630: 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42  PerMapPage = (pB
6640: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29  t->usableSize/5)
6650: 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20  +1;.  iPtrMap = 
6660: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
6670: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74  erMapPage;.  ret
6680: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
6690: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
66a0: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
66b0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
66c0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
66d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
66e0: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
66f0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
6700: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
6710: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
6720: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
6730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
6740: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
6750: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
6760: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
6770: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
6780: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
6790: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a  mber 'pgno'..**.
67a0: 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e  ** If *pRC is in
67b0: 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f  itially non-zero
67c0: 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29   (non-SQLITE_OK)
67d0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
67e0: 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  ne is.** a no-op
67f0: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
6800: 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f  ccurs, the appro
6810: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
6820: 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  e is written.** 
6830: 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74  into *pRC..*/.st
6840: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
6850: 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Put(BtShared *pB
6860: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
6870: 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65  eType, Pgno pare
6880: 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  nt, int *pRC){. 
6890: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
68a0: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
68b0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
68c0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
68d0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
68e0: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
68f0: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
6900: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
6910: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
6920: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
6930: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6940: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
6950: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
6960: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
6970: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
6980: 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
6990: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
69a0: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
69b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
69c0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
69d0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74  );.  /* The mast
69e0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er-journal page 
69f0: 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65  number must neve
6a00: 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70  r be used as a p
6a10: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6a20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
6a30: 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
6a40: 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t, PENDING_BYTE_
6a50: 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20  PAGE(pBt)) );.. 
6a60: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
6a70: 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66  toVacuum );.  if
6a80: 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  ( key==0 ){.    
6a90: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
6aa0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
6ab0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50  return;.  }.  iP
6ac0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
6ad0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
6ae0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
6af0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
6b00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6b10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6b20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6b30: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
6b40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6b50: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
6b60: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
6b70: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
6b80: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
6b90: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
6ba0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
6bb0: 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74  goto ptrmap_exit
6bc0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
6bd0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
6be0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
6bf0: 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20   );.  pPtrmap = 
6c00: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
6c10: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
6c20: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
6c30: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
6c40: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
6c50: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6c60: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
6c70: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
6c80: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
6c90: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
6ca0: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
6cb0: 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c    *pRC= rc = sql
6cc0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
6cd0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
6ce0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6cf0: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
6d00: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
6d10: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
6d20: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6d30: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
6d40: 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65   }.  }..ptrmap_e
6d50: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61  xit:.  sqlite3Pa
6d60: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
6d70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
6d80: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
6d90: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6da0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6db0: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
6dc0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
6dd0: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
6de0: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
6df0: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
6e00: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
6e10: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
6e20: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
6e30: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
6e40: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
6e50: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
6e60: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
6e70: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
6e80: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
6e90: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
6ea0: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
6eb0: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
6ec0: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
6ed0: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
6ee0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6ef0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
6f00: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
6f10: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
6f20: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
6f30: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
6f40: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
6f50: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
6f60: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
6f70: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
6f80: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
6f90: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
6fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
6fd0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
6fe0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
6ff0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7000: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
7010: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
7020: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
7030: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
7040: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
7050: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
7060: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7070: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
7080: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
7090: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
70a0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
70b0: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71  fset<0 ){.    sq
70c0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
70d0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65  pDbPage);.    re
70e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
70f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7100: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
7110: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
7120: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73  leSize-5 );.  as
7130: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
7140: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
7150: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
7160: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
7170: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
7180: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
7190: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
71a0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
71b0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
71c0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
71d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
71e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
71f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7200: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
7210: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
7220: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
7230: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
7240: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
7250: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
7260: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
7270: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
7280: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
7290: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
72a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
72b0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
72c0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
72d0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
72e0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
72f0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
7300: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
7310: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
7320: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
7330: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
7340: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
7350: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
7360: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
7370: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
7380: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
7390: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
73a0: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
73b0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
73c0: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
73d0: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
73e0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
73f0: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
7400: 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20  Cellv2(D,M,O,I) 
7410: 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44  (D+(M&get2byte(D
7420: 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a  +(O+2*(I)))))...
7430: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
7440: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
7450: 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20  n of findCell() 
7460: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
7470: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
7480: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
7490: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
74a0: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
74b0: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
74c0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
74d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
74e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
74f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
7500: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7510: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
7520: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
7530: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
7540: 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d  ;.    k = pPage-
7550: 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  >aiOvfl[i];.    
7560: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
7570: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
7580: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
7590: 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  turn pPage->apOv
75a0: 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  fl[i];.      }. 
75b0: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
75c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
75d0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
75e0: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
75f0: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
7600: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
7610: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
7620: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
7630: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
7640: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
7650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62  his function.  b
7660: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
7670: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
7680: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
7690: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
76a0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
76b0: 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20  Ptr() .** takes 
76c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
76d0: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c   body of the cel
76e0: 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20  l as its second 
76f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
7700: 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65  Within this file
7710: 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28  , the parseCell(
7720: 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63  ) macro can be c
7730: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66  alled instead of
7740: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
7750: 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73  llPtr(). Using s
7760: 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74  ome compilers, t
7770: 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74  his will be fast
7780: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
7790: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
77a0: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
77b0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
77c0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
77d0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
77e0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
77f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
7800: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
7810: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
7820: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
7830: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
7840: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
7850: 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20  ){.  u16 n;     
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7870: 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20  Number bytes in 
7880: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61  cell content hea
7890: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  der */.  u32 nPa
78a0: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
78b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
78c0: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
78d0: 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  oad */..  assert
78e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
78f0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7900: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49  >mutex) );..  pI
7910: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
7920: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
7930: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
7940: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
7950: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
7960: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
7970: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
7980: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
7990: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
79a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
79b0: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
79c0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30      assert( n==0
79d0: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 67 65   );.      n = ge
79e0: 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c  tVarint32(pCell,
79f0: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
7a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
7a10: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  yload = 0;.    }
7a20: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
7a30: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
7a40: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
7a50: 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  y);.    pInfo->n
7a60: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
7a70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
7a80: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a  nfo->nData = 0;.
7a90: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
7aa0: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
7ab0: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
7ac0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
7ad0: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
7ae0: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
7af0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
7b00: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
7b10: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
7b20: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
7b30: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
7b40: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
7b50: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
7b60: 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  );.  if( likely(
7b70: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
7b80: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
7b90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
7ba0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
7bb0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
7bc0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
7bd0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
7be0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
7bf0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
7c00: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
7c10: 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69   if( (pInfo->nSi
7c20: 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61  ze = (u16)(n+nPa
7c30: 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66  yload))<4 ) pInf
7c40: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
7c50: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7c60: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
7c70: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7c80: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
7c90: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
7ca0: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
7cb0: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
7cc0: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
7cd0: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
7ce0: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
7cf0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
7d00: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
7d10: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
7d20: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
7d30: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
7d40: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
7d50: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
7d60: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
7d70: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
7d80: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
7d90: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
7da0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
7db0: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
7dc0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
7dd0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
7de0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
7df0: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
7e00: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
7e10: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
7e20: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
7e30: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
7e40: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
7e50: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
7e60: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
7e70: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
7e80: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
7e90: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7ea0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7eb0: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
7ec0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
7ed0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7ee0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7ef0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
7f00: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
7f10: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
7f20: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
7f30: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
7f40: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
7f50: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
7f60: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
7f70: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
7f80: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
7f90: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
7fa0: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
7fb0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
7fc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
7fd0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
7fe0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7ff0: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8000: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
8010: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
8020: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
8030: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8040: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  6)surplus;.    }
8050: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
8060: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8070: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d  )minLocal;.    }
8080: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
8090: 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49  rflow = (u16)(pI
80a0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29  nfo->nLocal + n)
80b0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
80c0: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
80d0: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
80e0: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
80f0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
8100: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65   pInfo) \.  btre
8110: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
8120: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
8130: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
8140: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74  ), (pInfo)).stat
8150: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
8160: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
8170: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
8180: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
8190: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
81a0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
81b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
81c0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
81d0: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
81e0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
81f0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8200: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8210: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
8220: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
8230: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
8240: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
8250: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8260: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
8270: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
8280: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
8290: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
82a0: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
82b0: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
82c0: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
82d0: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
82e0: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
82f0: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
8300: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
8310: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
8320: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
8330: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
8340: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
8350: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8360: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
8370: 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c   *pIter = &pCell
8380: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
8390: 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69  Size];.  u32 nSi
83a0: 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ze;..#ifdef SQLI
83b0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
83c0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
83d0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
83e0: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
83f0: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
8400: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
8410: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
8420: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
8430: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
8440: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
8450: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
8460: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
8470: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
8480: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
8490: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
84a0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
84b0: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
84c0: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
84d0: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
84e0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
84f0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8500: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
8510: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
8520: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
8530: 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20    u8 *pEnd;.    
8540: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
8550: 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  ta ){.      pIte
8560: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8570: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
8580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8590: 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20   nSize = 0;.    
85a0: 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  }..    /* pIter 
85b0: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
85c0: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
85d0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
85e0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
85f0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8600: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8610: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8620: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8630: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8640: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8650: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8660: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8670: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8680: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8690: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
86a0: 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
86b0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
86c0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
86d0: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73  ize);.  }..  tes
86e0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
86f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
8700: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8710: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8720: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
8730: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
8740: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
8750: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8760: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8770: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8780: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8790: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
87a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
87b0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
87c0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
87d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
87e0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
87f0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
8800: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
8810: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
8820: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
8830: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
8840: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
8850: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69   += 4;.  }.  nSi
8860: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
8870: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f  r - pCell);..  /
8880: 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  * The minimum si
8890: 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69  ze of any cell i
88a0: 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  s 4 bytes. */.  
88b0: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20  if( nSize<4 ){. 
88c0: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20     nSize = 4;.  
88d0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69  }..  assert( nSi
88e0: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
88f0: 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ize );.  return 
8900: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
8910: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
8920: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
8930: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
8940: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
8950: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8960: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
8970: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
8980: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
8990: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
89a0: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
89b0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
89c0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
89d0: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
89e0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
89f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8a00: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
8a10: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
8a20: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
8a30: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
8a40: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
8a50: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
8a60: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
8a70: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
8a80: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
8a90: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
8aa0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8ab0: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
8ac0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8ad0: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
8ae0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
8af0: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
8b00: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
8b10: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
8b20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8b30: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
8b40: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
8b50: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
8b60: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
8b70: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
8b80: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
8b90: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
8ba0: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
8bb0: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
8bc0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
8bd0: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
8be0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
8bf0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
8c00: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
8c10: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
8c20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
8c30: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
8c40: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
8c50: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
8c60: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
8c70: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
8c80: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
8c90: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
8ca0: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
8cb0: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
8cc0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
8cd0: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
8ce0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
8cf0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
8d00: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
8d10: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
8d20: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
8d30: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8d60: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
8d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8d80: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
8d90: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
8da0: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8dc0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8dd0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8de0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8e00: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
8e10: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
8e20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8e30: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
8e40: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
8e50: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
8e60: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
8e70: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8e80: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
8e90: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
8ea0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
8eb0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8ec0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8ed0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8ee0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
8ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8f00: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
8f10: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
8f20: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
8f30: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
8f40: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
8f50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
8f60: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
8f70: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
8f80: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
8f90: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
8fa0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8fb0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
8fc0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
8fd0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
8fe0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
8ff0: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
9000: 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20   */...  assert( 
9010: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
9020: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9030: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
9040: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
9050: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9060: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9070: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
9080: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
9090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
90a0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
90b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
90c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
90d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
90e0: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
90f0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
9100: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
9110: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
9120: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9130: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
9140: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
9150: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
9160: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
9170: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
9180: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
9190: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
91a0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
91b0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
91c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
91d0: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
91e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
91f0: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
9200: 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64  (&temp[cbrk], &d
9210: 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
9220: 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20  eSize - cbrk);. 
9230: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
9240: 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ze;.  iCellFirst
9250: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
9260: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  2*nCell;.  iCell
9270: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
9280: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
9290: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
92a0: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
92b0: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
92c0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
92d0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
92e0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
92f0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
9300: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
9310: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
9320: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
9330: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
9340: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69  =iCellLast );.#i
9350: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9360: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
9370: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
9380: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
9390: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
93a0: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
93b0: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
93c0: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51  e().    ** if SQ
93d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
93e0: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20  SIZE_CELL_CHECK 
93f0: 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20  is defined .    
9400: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
9410: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
9420: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
9430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9440: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9450: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
9460: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
9470: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
9480: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
9490: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
94a0: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
94b0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
94c0: 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  size;.#if define
94d0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
94e0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
94f0: 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72  ECK).    if( cbr
9500: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  k<iCellFirst ){.
9510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9520: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9530: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
9540: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
9550: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
9560: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
9570: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9580: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9590: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
95a0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
95b0: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
95c0: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
95d0: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
95e0: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
95f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
9600: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
9610: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
9620: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
9630: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
9640: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
9650: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9660: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
9670: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
9680: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
9690: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
96a0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
96b0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
96c0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
96d0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
96e0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
96f0: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
9700: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
9710: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
9720: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9730: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9740: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
9750: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
9760: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
9770: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9780: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
97a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
97b0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
97c0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
97d0: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
97e0: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
97f0: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
9800: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
9810: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
9820: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
9830: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
9840: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
9850: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
9860: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
9870: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
9880: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
9890: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
98a0: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
98b0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
98c0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
98d0: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
98e0: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
98f0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
9900: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
9910: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
9920: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
9930: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
9940: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
9950: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
9960: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9970: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
9980: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
9990: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
99a0: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
99b0: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
99c0: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
99d0: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
99e0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
99f0: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
9a00: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
9a10: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
9a20: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
9a30: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
9a40: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
9a50: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9a60: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
9a70: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
9a80: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
9a90: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
9aa0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
9ab0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9ac0: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
9ad0: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
9ae0: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
9af0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
9b00: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
9b10: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9b40: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
9b50: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
9b60: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
9b90: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
9ba0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
9bb0: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
9bc0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
9bd0: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
9be0: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
9bf0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
9c00: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
9c10: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
9c20: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75   code */.  int u
9c30: 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
9c40: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65  able size of the
9c50: 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73   page */.  .  as
9c60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9c70: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9c80: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9c90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ca0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
9cb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9cc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9cd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9ce0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
9cf0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
9d00: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9d10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9d20: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9d30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9d40: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9d50: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9d60: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9d70: 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  bleSize;.  asser
9d80: 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c  t( nByte < usabl
9d90: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46  eSize-8 );..  nF
9da0: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
9db0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9dc0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
9dd0: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
9de0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
9df0: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
9e00: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
9e10: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20  e->nCell;.  top 
9e20: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
9e30: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
9e40: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
9e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9e60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74  ORRUPT_BKPT;.  t
9e70: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
9e80: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9e90: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
9ea0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9eb0: 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20  ==top );..  if( 
9ec0: 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20  nFrag>=60 ){.   
9ed0: 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61   /* Always defra
9ee0: 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61  gment highly fra
9ef0: 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f  gmented pages */
9f00: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
9f10: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
9f20: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9f30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
9f40: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
9f50: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
9f60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61  ;.  }else if( ga
9f70: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
9f80: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
9f90: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
9fa0: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
9fb0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
9fc0: 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  isfy .    ** the
9fd0: 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c   request. The al
9fe0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65  location is made
9ff0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
a000: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20  free slot in .  
a010: 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68    ** the list th
a020: 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  at is large enou
a030: 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  gh to accommodat
a040: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
a050: 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20   int pc, addr;. 
a060: 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b     for(addr=hdr+
a070: 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  1; (pc = get2byt
a080: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
a090: 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20  0; addr=pc){.   
a0a0: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
a0b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a0c0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
a0d0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 63   */.      if( pc
a0e0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
a0f0: 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20   pc<addr+4 ){.  
a100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a110: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a130: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a140: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
a150: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
a160: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
a170: 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42  nt x = size - nB
a180: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73  yte;.        tes
a190: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
a1a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
a1b0: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20   x==3 );.       
a1c0: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
a1d0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
a1e0: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
a1f0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
a200: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
a210: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
a220: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
a230: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
a240: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
a250: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
a260: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
a270: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
a280: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
a290: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
a2a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65    }else if( size
a2b0: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
a2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
a2d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a2e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a2f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a300: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
a310: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
a320: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
a330: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
a340: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unt.          **
a350: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
a360: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
a370: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
a380: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
a390: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
a3a0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
a3b0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63        *pIdx = pc
a3c0: 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65   + x;.        re
a3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a3e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a3f0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
a400: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   make sure there
a410: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
a420: 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73   in the gap to s
a430: 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20  atisfy.  ** the 
a440: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20  allocation.  If 
a450: 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e  not, defragment.
a460: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
a470: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
a480: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
a490: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
a4a0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
a4b0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
a4c0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
a4d0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
a4e0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
a4f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
a500: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
a510: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
a520: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
a530: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
a540: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
a550: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
a560: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
a570: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a580: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
a590: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
a5a0: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
a5b0: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
a5c0: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
a5d0: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
a5e0: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
a5f0: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
a600: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
a610: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
a620: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
a630: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
a640: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
a650: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
a660: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
a670: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
a680: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
a690: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a6a0: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
a6b0: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
a6c0: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
a6d0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
a6e0: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
a6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a710: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
a720: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
a730: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
a740: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
a750: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
a760: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
a770: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
a780: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
a790: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
a7a0: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
a7b0: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
a7c0: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
a7d0: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
a7e0: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
a7f0: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
a800: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
a810: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
a820: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
a830: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a840: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
a850: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
a860: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
a870: 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20    int iLast;    
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70      /* Largest p
a8a0: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
a8b0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e  k offset */.  un
a8c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
a8d0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a8e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
a8f0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
a900: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a910: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
a920: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
a930: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
a940: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
a950: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
a960: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
a970: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
a980: 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70   size) <= (int)p
a990: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a9a0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a9b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a9c0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a9d0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a9e0: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a9f0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
aa00: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
aa10: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
aa20: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
aa30: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
aa40: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
aa50: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
aa60: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
aa70: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
aa80: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
aa90: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
aaa0: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
aab0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
aac0: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
aad0: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
aae0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
aaf0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
ab00: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
ab10: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
ab20: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
ab30: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
ab40: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
ab50: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
ab60: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
ab70: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
ab80: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
ab90: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
aba0: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
abb0: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
abc0: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
abd0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
abe0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
abf0: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
ac00: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
ac10: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
ac20: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
ac30: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
ac40: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
ac50: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
ac60: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
ac70: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
ac80: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
ac90: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
aca0: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
acb0: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
acc0: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
acd0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
ace0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
acf0: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
ad00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ad10: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
ad20: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
ad30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
ad40: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
ad50: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
ad60: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
ad70: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
ad80: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
ad90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ada0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
adb0: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
adc0: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
add0: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
ade0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
adf0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ae00: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
ae10: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
ae20: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
ae30: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
ae40: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
ae50: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
ae60: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
ae70: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
ae80: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
ae90: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
aea0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
aeb0: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
aec0: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
aed0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
aee0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
aef0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
af00: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
af10: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
af20: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
af30: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
af40: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
af50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
af60: 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70  pbegin <= (int)p
af70: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
af80: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
af90: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
afa0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
afb0: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
afc0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
afd0: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
afe0: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
aff0: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
b000: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
b010: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
b020: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
b030: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61  ;.      if( (fra
b040: 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69  g<0) || (frag>(i
b050: 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20  nt)data[hdr+7]) 
b060: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
b070: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b080: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
b090: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
b0a0: 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20   -= (u8)frag;.  
b0b0: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
b0c0: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a  (&data[pnext]);.
b0d0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
b0e0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29  data[pbegin], x)
b0f0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78  ;.      x = pnex
b100: 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  t + get2byte(&da
b110: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70  ta[pnext+2]) - p
b120: 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74  begin;.      put
b130: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
b140: 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d  in+2], x);.    }
b150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
b160: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
b170: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
b180: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
b190: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
b1a0: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
b1b0: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
b1c0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
b1d0: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
b1e0: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
b1f0: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
b200: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
b210: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b220: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
b230: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
b240: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
b250: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
b260: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b270: 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79  hdr+5]) + get2by
b280: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
b290: 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  2]);.    put2byt
b2a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b2b0: 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  top);.  }.  asse
b2c0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b2d0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b2e0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b2f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b300: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
b310: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
b320: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
b330: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
b340: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
b350: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
b360: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
b370: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
b380: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
b390: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
b3a0: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
b3b0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
b3c0: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
b3d0: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
b3e0: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
b3f0: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
b400: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
b410: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
b420: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
b430: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
b440: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b450: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
b460: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
b470: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
b480: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
b490: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
b4a0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
b4b0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
b4c0: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
b4d0: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
b4e0: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
b4f0: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
b500: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
b510: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
b520: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
b530: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b540: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b550: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b560: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
b570: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
b580: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
b590: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
b5a0: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
b5b0: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
b5c0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b5d0: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
b5e0: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
b5f0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
b600: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
b610: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
b620: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
b630: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
b640: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b650: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
b660: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
b670: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b680: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
b690: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b6a0: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
b6b0: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
b6c0: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
b6d0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
b6e0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
b6f0: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a  e->hasData = 0;.
b700: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
b710: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
b720: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
b730: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
b740: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
b750: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
b760: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b770: 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  T;.  }.  pPage->
b780: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
b790: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
b7a0: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
b7b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b7c0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b7d0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
b7e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
b7f0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
b800: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b810: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b820: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
b830: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
b840: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
b850: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
b860: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
b870: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
b880: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
b890: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
b8a0: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
b8b0: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
b8c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
b8d0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
b8e0: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
b8f0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
b900: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
b910: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
b920: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
b930: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
b940: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
b950: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b960: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b970: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b980: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b990: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b9a0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
b9b0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
b9c0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
b9d0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b9e0: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
b9f0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
ba00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
ba10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ba20: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
ba30: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
ba40: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
ba50: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
ba60: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
ba70: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
ba80: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ba90: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
baa0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
bab0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
bad0: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
bae0: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
baf0: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
bb00: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
bb10: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
bb20: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
bb30: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
bb40: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
bb50: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
bb60: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
bb70: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
bb80: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
bb90: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
bba0: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
bbb0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
bbc0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
bbd0: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
bbe0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
bbf0: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
bc00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bc10: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
bc20: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
bc30: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
bc40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
bc50: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
bc60: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
bc70: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
bc80: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
bc90: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
bca0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
bcb0: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
bcc0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
bcd0: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bce0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
bcf0: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
bd00: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
bd10: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
bd20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
bd30: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
bd40: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
bd50: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
bd60: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
bd70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bd80: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
bd90: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
bda0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
bdb0: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
bdc0: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
bdd0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
bde0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
bdf0: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
be00: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
be10: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
be20: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
be30: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
be40: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
be50: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
be60: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
be70: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
be80: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
be90: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
bea0: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
beb0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
bec0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
bed0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
bee0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
bef0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
bf00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bf10: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
bf20: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
bf30: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
bf40: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
bf50: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
bf60: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
bf70: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
bf80: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
bf90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bfa0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  PT;.    }.    te
bfb0: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
bfc0: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
bfd0: 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  t) );..    /* A 
bfe0: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
bff0: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
c000: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
c010: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
c020: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
c030: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
c040: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
c050: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
c060: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
c070: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
c080: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
c090: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
c0a0: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
c0b0: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
c0c0: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
c0d0: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
c0e0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
c0f0: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
c100: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
c110: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
c120: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
c130: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c140: 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64  eSize - 4;.#if d
c150: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
c160: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
c170: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a  LL_CHECK).    {.
c180: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
c190: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c1a0: 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
c1b0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
c1c0: 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20        int sz;   
c1d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
c1e0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20  of a cell */..  
c1f0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
c200: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
c210: 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  --;.      for(i=
c220: 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
c230: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
c240: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c250: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
c260: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
c270: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c280: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
c290: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
c2a0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c2b0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
c2c0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
c2d0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
c2e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c2f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c300: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c310: 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
c320: 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
c330: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
c340: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
c350: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c360: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
c370: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
c380: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c390: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c3a0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
c3b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c3c0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
c3d0: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
c3e0: 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  }  .#endif..    
c3f0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c400: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c410: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c420: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c430: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c440: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
c450: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20  [hdr+7] + top;. 
c460: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
c470: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
c480: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
c490: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
c4a0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
c4b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ){.        /* St
c4c0: 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63  art of free bloc
c4d0: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67  k is off the pag
c4e0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
c4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c500: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
c510: 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
c520: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
c530: 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
c540: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c550: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
c560: 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  ( (next>0 && nex
c570: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c  t<=pc+size+3) ||
c580: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
c590: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
c5a0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
c5b0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
c5c0: 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68  ng order. And th
c5d0: 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20  e last byte of. 
c5e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
c5f0: 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69  ee-block must li
c600: 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
c610: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
c620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c630: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
c650: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
c660: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
c670: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
c680: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
c690: 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
c6a0: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
c6b0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c6c0: 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
c6d0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
c6e0: 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
c6f0: 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
c700: 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
c710: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c720: 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
c730: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c740: 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
c750: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
c760: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
c770: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
c780: 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
c790: 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
c7a0: 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
c7b0: 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
c7c0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
c7d0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
c7e0: 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
c7f0: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
c800: 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
c810: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
c820: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
c830: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
c840: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c850: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c860: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
c870: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c880: 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
c890: 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
c8a0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c8b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c8c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c8d0: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
c8e0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
c8f0: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
c900: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
c910: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
c920: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
c930: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
c940: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c950: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
c960: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
c970: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
c980: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
c990: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
c9a0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c9b0: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
c9c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c9d0: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
c9e0: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
c9f0: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
ca00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ca10: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
ca20: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
ca30: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
ca40: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
ca50: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
ca60: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
ca70: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
ca80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ca90: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
caa0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cab0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
cac0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
cad0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
cae0: 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
caf0: 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
cb00: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
cb10: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
cb20: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
cb30: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
cb40: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
cb50: 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
cb60: 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c  rst = hdr + ((fl
cb70: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
cb80: 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65   ? 12 : 8);.  me
cb90: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
cba0: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
cbb0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
cbc0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
cbd0: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
cbe0: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
cbf0: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70  >nFree = (u16)(p
cc00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
cc10: 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64   first);.  decod
cc20: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
cc30: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63  ags);.  pPage->c
cc40: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
cc50: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
cc60: 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
cc70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
cc80: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
cc90: 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
cca0: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
ccb0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
ccc0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
ccd0: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
cce0: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
ccf0: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
cd00: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
cd10: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
cd20: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
cd30: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
cd40: 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  it = 1;.}.../*.*
cd50: 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61  * Convert a DbPa
cd60: 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
cd70: 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20   the pager into 
cd80: 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62  a MemPage used b
cd90: 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c  y.** the btree l
cda0: 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
cdb0: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
cdc0: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50  geFromDbPage(DbP
cdd0: 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67  age *pDbPage, Pg
cde0: 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65  no pgno, BtShare
cdf0: 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
ce00: 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d  ge *pPage = (Mem
ce10: 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
ce20: 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
ce30: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ge);.  pPage->aD
ce40: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
ce50: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
ce60: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62  e);.  pPage->pDb
ce70: 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
ce80: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
ce90: 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e  Bt;.  pPage->pgn
cea0: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67  o = pgno;.  pPag
ceb0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
cec0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
ced0: 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  100 : 0;.  retur
cee0: 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
cef0: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
cf00: 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
cf10: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
cf20: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
cf30: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
cf40: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
cf50: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
cf60: 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69  noContent flag i
cf70: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
cf80: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
cf90: 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
cfa0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
cfb0: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
cfc0: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
cfd0: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
cfe0: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
cff0: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
d000: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
d010: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
d020: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
d030: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
d040: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
d050: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
d060: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
d070: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
d080: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
d090: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
d0a0: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
d0b0: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
d0c0: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
d0d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
d0e0: 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
d0f0: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
d100: 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
d110: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d130: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
d140: 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
d150: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
d160: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
d170: 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
d180: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
d190: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
d1a0: 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
d1b0: 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
d1c0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
d1d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
d1e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
d1f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
d200: 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
d210: 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
d220: 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
d230: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
d240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d250: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d260: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d270: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
d280: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
d290: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
d2a0: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
d2b0: 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
d2c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d2d0: 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
d2e0: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
d2f0: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
d300: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
d310: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d320: 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
d330: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d340: 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
d350: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
d360: 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
d370: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
d380: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
d390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
d3a0: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
d3b0: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
d3c0: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
d3d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
d3e0: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
d3f0: 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
d400: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
d410: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
d420: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
d430: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d440: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d450: 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
d460: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
d470: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
d480: 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
d490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
d4a0: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
d4b0: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
d4c0: 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
d4d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d4e0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
d4f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d500: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
d510: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
d520: 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
d530: 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
d540: 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
d550: 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
d560: 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
d570: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
d580: 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
d590: 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
d5a0: 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
d5b0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
d5c0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
d5d0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
d5e0: 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
d5f0: 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
d600: 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
d610: 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
d620: 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
d630: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
d640: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
d650: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
d660: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d670: 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
d680: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
d690: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
d6a0: 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
d6b0: 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
d6c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
d6d0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d6e0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
d6f0: 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
d700: 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
d710: 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
d720: 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
d730: 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
d740: 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
d750: 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
d760: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
d770: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
d780: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d7a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d7b0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d7e0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
d7f0: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
d800: 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
d810: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d820: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
d830: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62   here */.  int b
d840: 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20  Readonly        
d850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
d860: 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
d870: 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e   or 0 */.){.  in
d880: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
d890: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d8a0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d8b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 62 52 65 61  ;.  assert( bRea
d8c0: 64 6f 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54  donly==PAGER_GET
d8d0: 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65  _READONLY || bRe
d8e0: 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20  adonly==0 );..  
d8f0: 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
d900: 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
d910: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d920: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d930: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
d940: 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
d950: 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
d960: 62 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20  bReadonly);.    
d970: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d980: 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e  K && (*ppPage)->
d990: 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
d9a0: 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
d9b0: 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  tPage(*ppPage);.
d9c0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d9d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d9e0: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
d9f0: 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  ppPage);.      }
da00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65  .    }.  }..  te
da10: 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20  stcase( pgno==0 
da20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
da30: 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  o!=0 || rc==SQLI
da40: 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20  TE_CORRUPT );.  
da50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
da60: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
da70: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
da80: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
da90: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
daa0: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
dab0: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
dac0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
dad0: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
dae0: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
daf0: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
db00: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
db10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
db20: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
db30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
db40: 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20  DbPage!=0 );.   
db50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
db60: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
db70: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
db80: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
db90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
dba0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
dbb0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
dbc0: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
dbd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
dbe0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
dbf0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
dc00: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
dc10: 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
dc20: 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ull(pPage->pDbPa
dc30: 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
dc40: 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
dc50: 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
dc60: 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
dc70: 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
dc80: 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
dc90: 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
dca0: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
dcb0: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
dcc0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
dcd0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
dce0: 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
dcf0: 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
dd00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
dd10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
dd20: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
dd30: 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
dd40: 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
dd50: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
dd60: 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
dd70: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
dd80: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
dd90: 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
dda0: 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
ddb0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
ddc0: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
ddd0: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
dde0: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
ddf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
de00: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
de10: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
de20: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
de30: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
de40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
de50: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
de60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
de70: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
de80: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
de90: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
dea0: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
deb0: 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
dec0: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
ded0: 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
dee0: 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
def0: 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
df00: 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
df10: 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
df20: 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
df30: 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
df40: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
df50: 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  o btreeInitPage(
df60: 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  ) will likely re
df70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
df80: 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75  UPT..      ** Bu
df90: 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e  t no harm is don
dfa0: 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20  e by this.  And 
dfb0: 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72  it is very impor
dfc0: 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20  tant that.      
dfd0: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
dfe0: 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
dff0: 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
e000: 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
e010: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
e020: 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
e030: 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
e040: 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
e050: 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
e060: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
e070: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
e080: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e090: 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
e0a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e0b0: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
e0c0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
e0d0: 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
e0e0: 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a  pBt = (BtShared*
e0f0: 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  )pArg;.  assert(
e100: 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73   pBt->db );.  as
e110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e120: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62  tex_held(pBt->db
e130: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
e140: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f  turn sqlite3Invo
e150: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70  keBusyHandler(&p
e160: 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64  Bt->db->busyHand
e170: 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ler);.}../*.** O
e180: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
e190: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
e1a0: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
e1b0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
e1c0: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
e1d0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
e1e0: 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72   then an ephemer
e1f0: 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63  al database is c
e200: 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68  reated.  The eph
e210: 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
e220: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c  might.** be excl
e230: 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72  usively in memor
e240: 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75  y, or it might u
e250: 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20  se a disk-based 
e260: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a  memory cache..**
e270: 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
e280: 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
e290: 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f  ase will be auto
e2a0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
e2b0: 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74  d .** when sqlit
e2c0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
e2d0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
e2e0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e2f0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
e300: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
e310: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
e320: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
e330: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
e340: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
e350: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
e360: 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74   "flags" paramet
e370: 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
e380: 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61  that might conta
e390: 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20  in bits like.** 
e3a0: 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  BTREE_OMIT_JOURN
e3b0: 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f  AL and/or BTREE_
e3c0: 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  MEMORY..**.** If
e3d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
e3e0: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
e3f0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
e400: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
e410: 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e  ** and we are in
e420: 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f   shared cache mo
e430: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65  de, then the ope
e440: 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  n will fail with
e450: 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   an.** SQLITE_CO
e460: 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20  NSTRAINT error. 
e470: 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   We cannot allow
e480: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53   two or more BtS
e490: 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73  hared.** objects
e4a0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
e4b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e4c0: 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
e4d0: 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20  will lead.** to 
e4e0: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f  problems with lo
e4f0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
e500: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
e510: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
e520: 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53  Vfs,      /* VFS
e530: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
e540: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e   b-tree */.  con
e550: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
e560: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
e570: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
e580: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
e590: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
e5a0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
e5b0: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
e5c0: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
e5d0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
e5e0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
e5f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
e600: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
e610: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
e620: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
e630: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
e640: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
e650: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
e660: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
e670: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
e680: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
e690: 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
e6a0: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20  *pBt = 0;       
e6b0: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
e6c0: 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
e6d0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
e6e0: 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
e700: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
e710: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
e720: 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20  ex *mutexOpen = 
e730: 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20  0;  /* Prevents 
e740: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
e750: 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a  . Ticket #3537 *
e760: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e770: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e780: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
e790: 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  e from this func
e7a0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65  tion */.  u8 nRe
e7b0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
e7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
e7d0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e7e0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
e7f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
e800: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
e810: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65    /* Database he
e820: 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ader content */.
e830: 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70  .  /* True if op
e840: 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ening an ephemer
e850: 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61  al, temporary da
e860: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
e870: 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d  t int isTempDb =
e880: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
e890: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30   zFilename[0]==0
e8a0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
e8b0: 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62  variable isMemdb
e8c0: 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20   to true for an 
e8d0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
e8e0: 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c  se, or .  ** fal
e8f0: 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61  se for a file-ba
e900: 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  sed database..  
e910: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
e920: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
e930: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
e940: 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  db = 0;.#else.  
e950: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
e960: 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26  b = (zFilename &
e970: 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  & strcmp(zFilena
e980: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  me, ":memory:")=
e990: 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
e9a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69             || (i
e9b0: 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74  sTempDb && sqlit
e9c0: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64  e3TempInMemory(d
e9d0: 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  b)).            
e9e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76             || (v
e9f0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
ea00: 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30  _OPEN_MEMORY)!=0
ea10: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
ea20: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
ea30: 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29  ssert( pVfs!=0 )
ea40: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ea50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
ea60: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
ea70: 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78  ssert( (flags&0x
ea80: 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20  ff)==flags );   
ea90: 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20  /* flags fit in 
eaa0: 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  8 bits */..  /* 
eab0: 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e  Only a BTREE_SIN
eac0: 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e  GLE database can
ead0: 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45   be BTREE_UNORDE
eae0: 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  RED */.  assert(
eaf0: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
eb00: 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c  UNORDERED)==0 ||
eb10: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
eb20: 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20  SINGLE)!=0 );.. 
eb30: 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47   /* A BTREE_SING
eb40: 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61  LE database is a
eb50: 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72  lways a temporar
eb60: 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72  y and/or ephemer
eb70: 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
eb80: 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
eb90: 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54  INGLE)==0 || isT
eba0: 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  empDb );..  if( 
ebb0: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66  isMemdb ){.    f
ebc0: 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45  lags |= BTREE_ME
ebd0: 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MORY;.  }.  if( 
ebe0: 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
ebf0: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
ec00: 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20  !=0 && (isMemdb 
ec10: 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a  || isTempDb) ){.
ec20: 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28      vfsFlags = (
ec30: 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49  vfsFlags & ~SQLI
ec40: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
ec50: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54   | SQLITE_OPEN_T
ec60: 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20  EMP_DB;.  }.  p 
ec70: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
ec80: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65  ero(sizeof(Btree
ec90: 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ));.  if( !p ){.
eca0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ecb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
ecc0: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
ecd0: 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20  S_NONE;.  p->db 
ece0: 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  = db;.#ifndef SQ
ecf0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ed00: 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b  _CACHE.  p->lock
ed10: 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  .pBtree = p;.  p
ed20: 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20  ->lock.iTable = 
ed30: 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  1;.#endif..#if !
ed40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ed50: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ed60: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
ed70: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
ed80: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  /*.  ** If t
ed90: 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63  his Btree is a c
eda0: 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61  andidate for sha
edb0: 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74  red cache, try t
edc0: 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65  o find an.  ** e
edd0: 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64  xisting BtShared
ede0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20   object that we 
edf0: 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20  can share with. 
ee00: 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70   */.  if( isTemp
ee10: 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  Db==0 && (isMemd
ee20: 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67  b==0 || (vfsFlag
ee30: 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  s&SQLITE_OPEN_UR
ee40: 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  I)!=0) ){.    if
ee50: 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c  ( vfsFlags & SQL
ee60: 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
ee70: 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  ACHE ){.      in
ee80: 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
ee90: 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
eea0: 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
eeb0: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
eec0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
eed0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  nFullPathname);.
eee0: 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
eef0: 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
ef00: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
ef10: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
ef20: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  le = 1;.      if
ef30: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
ef40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ef50: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
ef60: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ef70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
ef80: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65  }.      if( isMe
ef90: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mdb ){.        m
efa0: 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e  emcpy(zFullPathn
efb0: 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ame, zFilename, 
efc0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
efd0: 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20  zFilename)+1);. 
efe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eff0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f000: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
f010: 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
f050: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
f060: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f080: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
f090: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
f0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
f0b0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
f0c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
f0d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
f0e0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
f0f0: 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
f100: 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
f110: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
f120: 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
f130: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f140: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
f150: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
f160: 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
f170: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
f180: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
f190: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
f1a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f1b0: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
f1c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
f1d0: 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
f1e0: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
f1f0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
f200: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
f210: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
f220: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
f230: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
f240: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
f250: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
f260: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
f270: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
f280: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
f290: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
f2a0: 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
f2b0: 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
f2c0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
f2d0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
f2e0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
f2f0: 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
f300: 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
f310: 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
f320: 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
f330: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
f340: 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
f350: 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
f360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f370: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f380: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
f390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f3a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f3b0: 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f3d0: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
f3e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
f3f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f400: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
f410: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f420: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
f430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
f440: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f450: 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
f460: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
f470: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
f480: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f490: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f4a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f4b0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
f4c0: 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
f4d0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
f4e0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
f4f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
f500: 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
f510: 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
f520: 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
f530: 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
f540: 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
f550: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
f560: 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
f570: 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
f580: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
f590: 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
f5a0: 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
f5b0: 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
f5c0: 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
f5d0: 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
f5e0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
f5f0: 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
f600: 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
f610: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
f620: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
f630: 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
f640: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
f650: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
f660: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
f670: 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
f680: 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
f690: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
f6a0: 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
f6b0: 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
f6c0: 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
f6d0: 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
f6e0: 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
f6f0: 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
f700: 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
f710: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
f720: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
f730: 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
f740: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29  8 || sizeof(i64)
f750: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
f760: 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
f770: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29  8 || sizeof(u64)
f780: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
f790: 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
f7a0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
f7b0: 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
f7c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f7d0: 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
f7e0: 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
f7f0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
f800: 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
f810: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
f820: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
f830: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
f840: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
f850: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
f860: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f870: 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
f880: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
f890: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
f8c0: 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
f8d0: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
f8e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f8f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f900: 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
f910: 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
f920: 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
f930: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f940: 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
f950: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
f960: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
f970: 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
f980: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
f990: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f9a0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
f9b0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
f9c0: 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
f9d0: 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
f9e0: 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
f9f0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
fa00: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
fa10: 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
fa20: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
fa30: 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
fa40: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
fa50: 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
fa60: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
fa70: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
fa80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
fa90: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
faa0: 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
fab0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
fac0: 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51  _ONLY;.#ifdef SQ
fad0: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
fae0: 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  TE.    pBt->btsF
faf0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
fb00: 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  RE_DELETE;.#endi
fb10: 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  f.    pBt->pageS
fb20: 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
fb30: 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
fb40: 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
fb50: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
fb60: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
fb70: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
fb80: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
fb90: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
fba0: 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
fbb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
fbc0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
fbd0: 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
fbe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fbf0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
fc00: 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
fc10: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
fc20: 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
fc30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
fc40: 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
fc50: 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
fc60: 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
fc70: 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
fc80: 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
fc90: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
fca0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
fcb0: 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
fcc0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
fcd0: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
fce0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
fcf0: 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
fd00: 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
fd10: 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
fd20: 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
fd30: 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
fd40: 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
fd50: 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
fd60: 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
fd70: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
fd80: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
fd90: 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
fda0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
fdb0: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
fdc0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
fdd0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
fde0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
fdf0: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
fe00: 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
fe10: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
fe20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
fe30: 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
fe40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65  }else{.      nRe
fe50: 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
fe60: 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
fe70: 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
fe80: 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
fe90: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
fea0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
feb0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
fec0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
fed0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
fee0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
fef0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
ff00: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ff10: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
ff20: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
ff30: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
ff40: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
ff50: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
ff60: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
ff70: 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
ff80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
ff90: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
ffa0: 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
ffb0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
ffc0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
ffd0: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
ffe0: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
fff0: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
10000 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
10010 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
10020 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
10030 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10040 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
10050 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10060 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
10070 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
10080 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
10090 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
100a0 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
100b0 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
100c0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
100d0 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  {.      MUTEX_LO
100e0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
100f0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
10100 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52   ).      pBt->nR
10110 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55  ef = 1;.      MU
10120 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78  TEX_LOGIC( mutex
10130 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
10140 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10150 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
10160 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69  ASTER);).      i
10170 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
10180 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
10190 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
101a0 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
101b0 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
101c0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
101d0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
101e0 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
101f0 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
10200 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
10210 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10220 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
10230 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
10240 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
10250 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
10260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10270 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10280 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
10290 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
102a0 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
102b0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
102c0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
102d0 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
102e0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
102f0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
10300 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
10310 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10320 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
10330 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
10340 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
10350 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
10360 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
10370 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10380 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
10390 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
103a0 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
103b0 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
103c0 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
103d0 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
103e0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
103f0 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
10400 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
10410 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
10420 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
10430 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
10440 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
10450 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
10460 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
10470 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
10480 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
10490 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
104a0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
104b0 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
104c0 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
104d0 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
104e0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
104f0 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
10500 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
10510 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
10520 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
10530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
10540 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
10550 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
10560 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10570 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
10580 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10590 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
105a0 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
105b0 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
105c0 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
105d0 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
105e0 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
105f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10600 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
10610 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
10620 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
10630 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
10640 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
10650 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
10660 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
10670 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10680 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
10690 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
106a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
106b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
106c0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
106d0 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
106e0 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
106f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10700 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
10710 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
10720 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
10730 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
10740 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
10750 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
10760 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10770 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
10780 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
10790 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
107a0 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73  -Tree was succes
107b0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73  sfully opened, s
107c0 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  et the pager-cac
107d0 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20  he size to the. 
107e0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61     ** default va
107f0 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65  lue. Except, whe
10800 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20  n opening on an 
10810 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20  existing shared 
10820 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20  pager-cache,.   
10830 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67   ** do not chang
10840 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  e the pager-cach
10850 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
10860 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
10870 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20  reeSchema(p, 0, 
10880 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)==0 ){.      s
10890 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
108a0 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e  chesize(p->pBt->
108b0 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  pPager, SQLITE_D
108c0 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
108d0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  E);.    }.  }.  
108e0 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
108f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
10900 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10910 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
10920 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10930 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
10940 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10950 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
10960 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
10970 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
10980 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
10990 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
109a0 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
109b0 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
109c0 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
109d0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
109e0 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
109f0 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
10a00 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
10a10 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
10a20 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
10a30 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
10a40 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
10a50 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
10a60 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
10a70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
10a80 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55  HARED_CACHE.  MU
10a90 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
10aa0 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
10ab0 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20  r; ).  BtShared 
10ac0 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
10ad0 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
10ae0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10af0 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
10b00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54  >mutex) );.  MUT
10b10 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
10b20 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
10b30 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
10b40 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
10b50 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
10b60 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
10b70 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
10b80 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
10b90 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
10ba0 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
10bb0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10bc0 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
10bd0 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
10be0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
10bf0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
10c00 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
10c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10c20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
10c30 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
10c40 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
10c50 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
10c60 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
10c70 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
10c80 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
10c90 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
10ca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10cb0 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
10cc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
10cd0 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
10ce0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
10cf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
10d00 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
10d10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10d20 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
10d30 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
10d40 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
10d50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
10d60 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
10d70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
10d80 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
10d90 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
10da0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
10db0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
10dc0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
10dd0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
10de0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
10df0 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
10e00 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
10e10 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
10e20 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
10e30 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
10e40 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
10e50 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
10e60 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
10e70 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  pageSize );..   
10e80 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75   /* One of the u
10e90 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70  ses of pBt->pTmp
10ea0 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d  Space is to form
10eb0 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a  at cells before.
10ec0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67      ** inserting
10ed0 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61   them into a lea
10ee0 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e  f page (function
10ef0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20   fillInCell()). 
10f00 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c  If.    ** a cell
10f10 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20   is less than 4 
10f20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69  bytes in size, i
10f30 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20  t is rounded up 
10f40 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a  to 4 bytes.    *
10f50 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  * by the various
10f60 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d   routines that m
10f70 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79  anipulate binary
10f80 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20   cells. Which.  
10f90 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68    ** can mean th
10fa0 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  at fillInCell() 
10fb0 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73  only initializes
10fc0 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20   the first 2 or 
10fd0 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  3.    ** bytes o
10fe0 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74  f pTmpSpace, but
10ff0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
11000 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69  4 bytes are copi
11010 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69  ed from.    ** i
11020 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73  t into a databas
11030 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20  e page. This is 
11040 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70  not actually a p
11050 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20  roblem, but it. 
11060 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65     ** does cause
11070 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f   a valgrind erro
11080 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20  r when the 1 or 
11090 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69  2 bytes of uniti
110a0 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64  alized .    ** d
110b0 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f  ata is passed to
110c0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69   system call wri
110d0 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69  te(). So to avoi
110e0 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20  d this error,.  
110f0 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69    ** zero the fi
11100 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
11110 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 20  emp space here. 
11120 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
11130 3e 70 54 6d 70 53 70 61 63 65 20 29 20 6d 65 6d  >pTmpSpace ) mem
11140 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
11150 63 65 2c 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d  ce, 0, 4);.  }.}
11160 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
11170 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
11180 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
11190 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
111a0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
111b0 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
111c0 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e  3PageFree( pBt->
111d0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42  pTmpSpace);.  pB
111e0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30  t->pTmpSpace = 0
111f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
11200 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
11210 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
11220 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
11230 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11240 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
11250 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11260 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
11270 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
11280 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
11290 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
112a0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
112b0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
112c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
112d0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
112e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
112f0 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d  ter(p);.  pCur =
11300 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
11310 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
11320 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
11330 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
11340 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
11350 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
11360 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
11370 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11380 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
11390 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
113a0 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
113b0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
113c0 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
113d0 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
113e0 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
113f0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
11400 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
11410 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
11420 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
11430 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
11440 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
11450 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f  lback(p, SQLITE_
11460 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  OK);.  sqlite3Bt
11470 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
11480 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
11490 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
114a0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
114b0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
114c0 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
114d0 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
114e0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
114f0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
11500 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
11510 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
11520 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
11530 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
11540 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
11550 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
11560 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
11570 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
11580 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
11590 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
115a0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
115b0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
115c0 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
115d0 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
115e0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
115f0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
11600 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
11610 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
11620 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
11630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11640 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
11650 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
11660 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
11670 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
11680 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
11690 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
116a0 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
116b0 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
116c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
116d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
116e0 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
116f0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
11700 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11710 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11720 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
11730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
11740 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
11750 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
11760 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
11770 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
11780 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
11790 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
117a0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
117b0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
117c0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
117d0 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
117e0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
117f0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
11800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11810 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
11820 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
11830 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
11840 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
11850 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
11860 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
11870 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
11880 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
11890 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
118a0 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
118b0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
118c0 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
118d0 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
118e0 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
118f0 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
11900 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
11910 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
11920 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
11930 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
11940 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
11950 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
11960 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
11970 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
11980 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
11990 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
119a0 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
119b0 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
119c0 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
119d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
119e0 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
119f0 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
11a00 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
11a10 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
11a20 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
11a30 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
11a40 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
11a50 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
11a60 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
11a70 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
11a80 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
11a90 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
11aa0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
11ab0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
11ac0 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
11ad0 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
11ae0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
11af0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
11b00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11b10 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
11b20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11b30 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11b40 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
11b50 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11b60 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
11b70 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
11b80 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
11b90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11ba0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
11bc0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
11bd0 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
11be0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
11bf0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
11c00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11c10 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
11c20 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
11c30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11c40 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
11c50 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
11c60 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
11c70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11c80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11c90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11ca0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
11cb0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
11cc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11cd0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
11ce0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
11cf0 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
11d00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11d10 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11d20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11d30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11d40 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
11d50 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
11d60 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
11d70 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
11d80 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
11d90 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
11da0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
11db0 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
11dc0 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
11dd0 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
11de0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
11df0 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
11e00 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
11e10 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
11e20 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
11e30 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
11e40 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
11e50 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
11e60 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
11e70 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
11e80 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
11e90 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
11ea0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
11eb0 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
11ec0 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
11ed0 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
11ee0 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
11ef0 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
11f00 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
11f10 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11f20 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
11f30 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
11f40 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
11f50 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f70 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
11f80 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
11f90 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
11fa0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
11fb0 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
11fc0 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
11fd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11fe0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
11ff0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12000 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
12010 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
12020 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12030 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
12040 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
12050 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
12060 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12070 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
12080 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
12090 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
120a0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
120b0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
120c0 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
120d0 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
120e0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
120f0 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
12100 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
12110 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
12120 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
12130 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
12140 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
12150 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12160 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
12170 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12180 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
12190 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
121a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
121b0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
121c0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
121d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
121e0 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
121f0 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
12200 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12210 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12220 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
12230 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
12240 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
12250 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
12260 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
12270 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
12280 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
12290 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
122a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
122b0 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
122c0 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
122d0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
122e0 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
122f0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
12300 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
12310 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
12320 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
12330 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
12340 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
12350 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
12360 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
12370 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
12380 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
12390 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
123a0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
123b0 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
123c0 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
123d0 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
123e0 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
123f0 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
12400 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
12410 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
12420 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
12430 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
12440 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
12450 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
12460 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
12470 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
12480 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
12490 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
124a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
124b0 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
124c0 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
124d0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
124e0 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
124f0 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
12500 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
12510 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
12520 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
12530 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
12540 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
12550 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
12560 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12570 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
12580 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
12590 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
125a0 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
125b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
125c0 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
125d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
125e0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
125f0 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
12600 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
12610 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12620 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
12630 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
12640 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
12650 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12660 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
12670 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
12680 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
12690 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
126a0 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
126b0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
126c0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
126d0 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
126e0 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
126f0 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
12700 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
12710 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
12720 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
12730 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
12740 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
12750 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
12760 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
12770 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
12780 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
12790 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
127a0 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
127b0 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
127c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
127d0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
127e0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
127f0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
12800 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
12810 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
12820 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
12830 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
12840 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
12850 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
12860 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
12870 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
12880 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
12890 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
128a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
128b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
128c0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
128d0 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
128e0 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
128f0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
12900 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
12910 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
12920 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  pageSize;.}..#if
12930 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12940 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65  HAS_CODEC) || de
12950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
12960 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  UG)./*.** This f
12970 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
12980 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
12990 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
129a0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
129b0 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
129c0 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
129d0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
129e0 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
129f0 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
12a00 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
12a10 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
12a20 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
12a30 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
12a40 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
12a50 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
12a60 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
12a70 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
12a80 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
12a90 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
12aa0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
12ab0 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
12ac0 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
12ad0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
12ae0 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
12af0 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
12b00 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
12b10 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
12b20 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
12b30 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
12b40 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
12b50 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
12b60 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
12b70 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
12b80 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
12b90 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
12ba0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12bb0 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
12bc0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
12bd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
12be0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
12bf0 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
12c00 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
12c10 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47   || SQLITE_DEBUG
12c20 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
12c30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
12c40 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
12c50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12c60 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
12c70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
12c80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
12c90 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
12ca0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
12cb0 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
12cc0 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
12cd0 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
12ce0 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
12cf0 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
12d00 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
12d10 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69  extensions..*/.i
12d20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12d30 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
12d40 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
12d50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12d60 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
12d70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
12d80 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
12d90 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
12da0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12db0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
12dc0 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
12dd0 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
12de0 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
12df0 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
12e00 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
12e10 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
12e20 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
12e30 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
12e40 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
12e50 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
12e60 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
12e70 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
12e80 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
12e90 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
12ea0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
12eb0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
12ec0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12ed0 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
12ee0 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
12ef0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
12f00 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
12f10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12f20 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
12f30 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54  /*.** Set the BT
12f40 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
12f50 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20  flag if newFlag 
12f60 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e  is 0 or 1.  If n
12f70 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a  ewFlag is -1,.**
12f80 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68   then make no ch
12f90 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72  anges.  Always r
12fa0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
12fb0 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  of the BTS_SECUR
12fc0 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74  E_DELETE.** sett
12fd0 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68  ing after the ch
12fe0 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
12ff0 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
13000 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
13010 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
13020 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
13030 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13040 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13050 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  r(p);.  if( newF
13060 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
13070 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
13080 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45  = ~BTS_SECURE_DE
13090 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65  LETE;.    if( ne
130a0 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e  wFlag ) p->pBt->
130b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
130c0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
130d0 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42   } .  b = (p->pB
130e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
130f0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
13100 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  !=0;.  sqlite3Bt
13110 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13120 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69  eturn b;.}.#endi
13130 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
13140 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
13150 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
13160 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13170 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
13180 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
13190 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
131a0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
131b0 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
131c0 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
131d0 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
131e0 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
131f0 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
13200 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
13210 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
13220 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
13230 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
13240 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
13250 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
13260 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
13270 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
13280 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
13290 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
132a0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
132b0 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
132c0 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
132d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
132e0 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
132f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
13300 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
13310 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13320 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13330 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
13340 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
13350 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13360 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
13370 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
13380 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
13390 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
133a0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
133b0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
133c0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
133d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
133e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
133f0 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
13400 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
13410 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
13420 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13430 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
13440 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
13450 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
13460 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
13470 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
13480 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
13490 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
134a0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
134b0 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
134c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
134d0 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
134e0 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
134f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13500 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
13510 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
13520 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
13530 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
13540 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13550 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
13560 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
13570 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
13580 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
13590 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
135a0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
135b0 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
135c0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
135d0 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
135e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
135f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
13600 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
13610 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
13620 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
13630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13640 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
13650 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
13660 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
13670 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
13680 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
13690 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
136a0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
136b0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
136c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
136d0 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
136e0 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
136f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
13700 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
13710 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
13720 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
13730 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
13740 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
13750 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
13760 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
13770 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
13780 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
137a0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
137b0 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
137c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
137d0 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
137e0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
137f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
13800 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
13810 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
13820 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
13830 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
13840 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
13850 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13860 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13870 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
13880 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
13890 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
138a0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
138b0 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
138c0 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
138d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
138e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
138f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
13900 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
13910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13920 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
13930 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
13940 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13950 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
13960 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
13970 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
13980 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
13990 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
139a0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
139b0 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
139c0 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
139d0 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
139e0 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
139f0 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
13a00 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
13a10 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
13a20 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
13a30 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
13a40 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
13a50 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
13a60 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
13a70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
13a80 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
13a90 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
13aa0 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
13ab0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
13ac0 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
13ad0 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
13ae0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
13af0 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
13b00 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
13b10 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
13b20 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
13b30 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
13b40 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
13b50 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
13b60 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
13b70 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
13b80 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13b90 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13ba0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13bb0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
13bc0 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
13bd0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13be0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
13bf0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
13c00 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
13c10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13c20 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13c30 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
13c40 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
13c50 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
13c60 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
13c70 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
13c80 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13c90 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
13ca0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13cb0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
13cc0 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
13cd0 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
13ce0 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
13cf0 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
13d00 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
13d10 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
13d20 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
13d30 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
13d40 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
13d50 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
13d60 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
13d70 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
13d80 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
13d90 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
13da0 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
13db0 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
13dc0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
13dd0 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
13de0 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
13df0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
13e00 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
13e10 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
13e20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
13e30 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
13e40 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
13e50 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
13e60 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
13e70 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
13e80 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13e90 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
13ea0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
13eb0 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
13ec0 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
13ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13ee0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
13ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
13f00 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
13f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13f20 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
13f30 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13f40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13f50 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  ( isOpen==0 ){. 
13f60 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
13f70 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
13f80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13f90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
13fa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13fb0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
13fc0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
13fd0 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
13fe0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13ff0 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
14000 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
14010 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
14020 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
14030 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
14040 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
14050 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
14060 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
14070 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
14080 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
14090 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
140a0 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
140b0 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
140c0 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
140d0 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
140e0 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
140f0 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
14100 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
14110 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
14120 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
14130 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
14140 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
14150 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
14160 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
14170 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
14180 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
14190 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
141a0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
141b0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
141c0 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
141d0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
141e0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
141f0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
14200 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
14210 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
14220 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
14230 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
14240 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
14250 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
14260 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
14270 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
14280 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
14290 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
142a0 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
142b0 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
142c0 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
142d0 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
142e0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
142f0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
14300 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
14310 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
14320 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
14330 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
14340 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
14350 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
14360 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
14370 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
14380 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
14390 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
143a0 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
143b0 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
143c0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
143d0 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
143e0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
143f0 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
14400 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
14410 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
14420 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
14430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14440 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
14450 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
14460 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
144a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
144b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
144c0 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
144d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
144e0 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
144f0 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
14500 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
14510 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14520 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
14530 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
14540 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
14550 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
14560 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
14570 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14580 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
14590 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
145a0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
145b0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
145c0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
145d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
145e0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
145f0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
14600 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
14610 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
14620 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
14630 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
14640 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
14650 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
14660 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
14670 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
14680 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
14690 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
146a0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
146b0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
146c0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
146d0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
146e0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
146f0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
14700 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
14710 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
14720 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
14730 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
14740 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
14750 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
14760 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
14770 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
14780 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
14790 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
147a0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
147b0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
147c0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
147d0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
147e0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
147f0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
14800 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
14810 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
14820 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
14830 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
14840 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
14850 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
14860 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
14870 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
14880 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
14890 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
148a0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
148b0 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
148c0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
148d0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
148e0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
148f0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
14900 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
14910 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
14920 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
14930 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
14940 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
14950 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
14960 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
14970 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
14980 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
14990 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
149a0 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
149b0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
149c0 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
149d0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
149e0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
149f0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
14a00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
14a10 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
14a20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
14a30 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
14a40 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
14a50 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
14a60 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
14a70 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
14a80 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
14a90 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
14aa0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
14ab0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
14ac0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
14ad0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
14ae0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14af0 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
14b00 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
14b10 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
14b20 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
14b30 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
14b40 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
14b50 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
14b60 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
14b70 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
14b80 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
14b90 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
14ba0 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
14bb0 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
14bc0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
14bd0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
14be0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
14bf0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
14c00 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
14c10 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
14c20 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
14c30 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
14c40 68 65 20 64 61 74 61 62 73 65 2e 20 20 43 75 72  he databse.  Cur
14c50 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
14c60 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
14c70 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
14c80 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
14c90 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
14ca0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
14cb0 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
14cc0 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
14cd0 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
14ce0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
14cf0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
14d00 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
14d10 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
14d20 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
14d30 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
14d40 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
14d50 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
14d60 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
14d70 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
14d80 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
14d90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
14da0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
14db0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
14dc0 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
14dd0 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
14de0 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
14df0 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
14e00 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
14e10 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
14e20 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
14e30 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
14e40 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
14e50 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
14e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
14e70 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
14e80 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
14e90 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
14ea0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
14eb0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
14ec0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
14ed0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14ee0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
14ef0 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
14f00 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
14f10 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
14f20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14f30 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
14f40 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
14f50 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
14f60 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
14f70 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
14f80 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
14f90 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
14fa0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14fb0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
14fc0 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
14fd0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
14fe0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
14ff0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
15000 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
15010 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
15020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15030 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
15040 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
15050 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
15060 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
15070 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
15080 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
15090 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
150a0 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
150b0 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
150c0 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
150d0 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
150e0 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
150f0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
15100 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
15110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
15120 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
15130 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
15140 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
15150 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
15160 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
15170 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15180 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
15190 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
151a0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
151b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
151c0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
151d0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
151e0 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
151f0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
15200 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
15210 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15220 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
15230 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15240 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
15250 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
15260 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
15270 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
15280 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
15290 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
152a0 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
152b0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
152c0 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
152d0 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
152e0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
152f0 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
15300 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
15310 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
15320 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
15330 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
15340 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
15350 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
15360 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
15370 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
15380 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
15390 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
153a0 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
153b0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
153c0 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
153d0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
153e0 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
153f0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
15400 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
15410 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
15420 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
15430 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
15440 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
15450 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15460 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
15470 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
15480 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
15490 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
154a0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
154b0 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
154c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
154d0 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
154e0 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
154f0 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
15500 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
15510 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
15520 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
15530 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
15540 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
15550 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
15560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15570 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
15580 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
15590 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
155a0 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
155b0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
155c0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
155d0 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
155e0 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
155f0 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
15600 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
15610 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
15620 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
15630 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
15640 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
15650 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
15660 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
15670 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15680 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
15690 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
156a0 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
156b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
156c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
156d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
156e0 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
156f0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
15700 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
15710 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
15720 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
15730 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
15740 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
15750 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
15760 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
15770 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15780 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
15790 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
157a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
157b0 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
157c0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
157d0 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
157e0 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
157f0 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
15800 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
15810 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
15820 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
15830 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
15840 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
15850 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
15860 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
15870 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
15880 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
15890 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
158a0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
158b0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
158c0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
158d0 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
158e0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
158f0 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
15900 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
15910 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
15920 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
15930 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
15940 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
15950 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
15960 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
15970 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15980 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
15990 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
159a0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
159b0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
159c0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
159d0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
159e0 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
159f0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15a00 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
15a10 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
15a20 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
15a30 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
15a40 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
15a50 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
15a60 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
15a70 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
15a80 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
15a90 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
15aa0 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
15ab0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
15ac0 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
15ad0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
15ae0 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
15af0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
15b00 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
15b10 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
15b20 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
15b30 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
15b40 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
15b50 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
15b60 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
15b70 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
15b80 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
15b90 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
15ba0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
15bb0 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
15bc0 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
15bd0 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
15be0 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
15bf0 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
15c00 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
15c10 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
15c20 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
15c30 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
15c40 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
15c50 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
15c60 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
15c70 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
15c80 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
15c90 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
15ca0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
15cb0 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
15cc0 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
15cd0 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
15ce0 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
15cf0 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
15d00 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
15d10 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
15d20 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
15d30 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
15d40 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
15d50 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
15d60 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
15d70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15d80 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
15d90 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
15da0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c  {.  sqlite3 *pBl
15db0 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ock = 0;.  BtSha
15dc0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15dd0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
15de0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
15df0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15e00 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
15e10 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
15e20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
15e30 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
15e40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
15e50 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
15e60 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
15e70 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
15e80 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
15e90 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
15ea0 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
15eb0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
15ec0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
15ed0 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
15ee0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
15ef0 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
15f00 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
15f10 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
15f20 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
15f30 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
15f40 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
15f50 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
15f60 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  cate)==0 );..  /
15f70 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
15f80 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
15f90 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
15fa0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
15fb0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
15fc0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
15fd0 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
15fe0 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
15ff0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16000 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
16010 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
16020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16030 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
16040 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
16050 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
16060 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
16070 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
16080 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
16090 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
160a0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
160b0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
160c0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
160d0 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
160e0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
160f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
16100 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
16110 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
16120 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70  _WRITE).   || (p
16130 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16140 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
16150 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
16160 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
16170 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
16180 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
16190 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
161a0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
161b0 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
161c0 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
161d0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
161e0 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
161f0 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
16200 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
16210 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
16220 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16230 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
16240 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
16250 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
16260 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
16270 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
16280 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
16290 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
162a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
162b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
162c0 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
162d0 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
162e0 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
162f0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
16300 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
16310 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
16320 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
16330 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
16340 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
16350 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
16360 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
16370 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
16380 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
16390 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
163a0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
163b0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
163c0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
163d0 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
163e0 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
163f0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
16400 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
16410 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
16420 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
16430 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
16440 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
16450 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
16460 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
16470 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
16480 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
16490 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
164a0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
164b0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
164c0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
164d0 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
164e0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
164f0 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
16500 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
16510 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
16520 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
16530 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
16540 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
16550 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
16560 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
16570 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
16580 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
16590 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
165a0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
165b0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
165c0 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
165d0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
165e0 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
165f0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
16600 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
16610 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
16620 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
16630 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16640 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
16650 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
16660 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
16670 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
16680 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16690 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
166a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
166b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
166c0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
166d0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
166e0 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
166f0 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
16700 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
16710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16720 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
16730 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
16740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16750 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
16760 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16770 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
16780 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
16790 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
167a0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
167b0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
167c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
167d0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
167e0 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
167f0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
16800 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
16810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16820 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
16830 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
16840 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
16850 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
16860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16870 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
16880 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
16890 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
168a0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
168b0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
168c0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
168d0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
168e0 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
168f0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
16900 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
16910 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
16920 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
16930 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
16940 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
16950 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
16960 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
16970 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
16980 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
16990 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
169a0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
169b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
169c0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
169d0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
169e0 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
169f0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
16a00 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
16a10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
16a20 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
16a30 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
16a40 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
16a50 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
16a60 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
16a70 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
16a80 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
16a90 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
16aa0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16ab0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
16ac0 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
16ad0 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
16ae0 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
16af0 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
16b00 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
16b10 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
16b20 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
16b30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16b40 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
16b50 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
16b60 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
16b70 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
16b80 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
16b90 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
16ba0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
16bb0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
16bc0 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
16bd0 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
16be0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
16bf0 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
16c00 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
16c10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16c20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16c30 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
16c40 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
16c50 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
16c60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16c70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
16c80 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
16c90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16cb0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
16cc0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
16cd0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
16ce0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16d00 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
16d10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16d20 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
16d30 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
16d40 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
16d50 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
16d60 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
16d70 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
16d80 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
16d90 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
16da0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
16db0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
16dc0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16dd0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
16de0 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
16df0 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
16e00 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
16e10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
16e20 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
16e30 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
16e40 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
16e50 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
16e60 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
16e70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16ea0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
16eb0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
16ec0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
16ed0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
16ee0 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
16ef0 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
16f00 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
16f10 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
16f20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
16f30 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
16f40 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
16f50 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
16f60 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
16f70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
16f80 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
16f90 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
16fa0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
16fd0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
16fe0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
17010 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
17020 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17040 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
17050 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
17060 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
17070 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
17080 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
17090 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
170a0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
170b0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
170c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
170d0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
170e0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
170f0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
17100 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
17110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17120 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
17130 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
17140 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
17150 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
17160 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
17170 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
17180 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
17190 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
171a0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
171b0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
171c0 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
171d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
171e0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
171f0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
17200 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
17210 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
17220 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
17230 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
17240 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
17250 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
17260 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
17270 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
17280 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
17290 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
172a0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
172b0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
172c0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
172d0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
172e0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
172f0 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
17300 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
17310 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17320 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
17330 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
17340 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
17350 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
17360 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
17370 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
17380 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
17390 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
173a0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
173b0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
173c0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
173d0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
173e0 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
173f0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
17400 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
17410 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
17420 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
17430 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
17440 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
17450 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
17460 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
17470 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
17480 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
17490 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
174b0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
174c0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
174d0 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
174e0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
174f0 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
17500 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
17510 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
17520 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
17530 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17540 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
17550 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
17560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
17570 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
17580 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
17590 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
175a0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
175b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
175c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
175d0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
175e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
175f0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
17600 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
17610 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
17620 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
17630 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
17640 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
17650 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
17660 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
17670 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
17680 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
17690 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
176a0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
176b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
176c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
176d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
176e0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
176f0 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
17700 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
17710 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
17720 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
17730 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
17740 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
17750 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
17760 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
17770 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
17780 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
17790 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
177a0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
177b0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
177c0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
177d0 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
177e0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
177f0 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
17800 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
17810 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
17820 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
17830 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
17840 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
17850 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
17860 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
17870 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
17880 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
17890 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
178a0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
178b0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
178c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
178d0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
178e0 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
178f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17910 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
17920 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
17930 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
17940 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
17950 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
17960 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17980 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
17990 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
179a0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
179b0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
179c0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
179d0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
179e0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
179f0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
17a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17a10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17a30 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
17a40 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
17a50 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
17a60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
17a70 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
17a80 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
17a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17aa0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
17ab0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
17ac0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
17ad0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
17ae0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
17af0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
17b00 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
17b10 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
17b20 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
17b30 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
17b40 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
17b50 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
17b60 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
17b70 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
17b80 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
17b90 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
17ba0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
17bb0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
17bc0 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
17bd0 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
17be0 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
17bf0 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
17c00 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
17c10 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
17c20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
17c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
17c40 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
17c50 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
17c60 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
17c70 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
17c80 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
17c90 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
17ca0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
17cb0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
17cc0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
17cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
17ce0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
17cf0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
17d00 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
17d10 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
17d20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
17d30 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
17d40 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
17d50 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
17d60 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
17d70 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
17d80 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
17d90 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
17da0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
17db0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
17dc0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
17dd0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
17de0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
17df0 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
17e00 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
17e10 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
17e20 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
17e30 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
17e40 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
17e50 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
17e60 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
17e70 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
17e80 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
17e90 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
17ea0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
17eb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17ec0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
17ee0 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
17ef0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
17f00 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
17f10 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
17f20 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
17f30 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
17f40 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
17f50 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
17f60 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
17f70 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
17f80 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
17f90 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
17fa0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
17fb0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
17fc0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17fd0 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
17fe0 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
17ff0 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
18000 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18010 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
18020 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
18030 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
18040 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
18050 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
18060 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
18070 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
18080 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
18090 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
180a0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
180b0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
180c0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
180d0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
180e0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
180f0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
18100 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
18110 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
18120 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
18130 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
18140 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
18150 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
18160 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
18170 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
18180 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
18190 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
181a0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
181b0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
181c0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
181d0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
181e0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
181f0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
18200 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
18210 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
18220 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
18230 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
18240 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18250 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
18260 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
18270 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
18280 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
18290 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
182a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
182b0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
182c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
182d0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
182e0 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
182f0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
18300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
18320 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18330 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
18340 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
18350 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
18360 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
18370 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
18380 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
18390 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
183a0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
183b0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
183c0 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
183d0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
183e0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
183f0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
18400 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
18410 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
18420 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
18430 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
18440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18450 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18460 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
18470 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
18480 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
18490 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
184a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
184b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
184c0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
184d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
184e0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
184f0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
18500 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
18510 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
18520 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
18530 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
18540 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18550 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
18560 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
18570 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
18580 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
18590 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
185a0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
185b0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
185c0 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
185d0 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
185e0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
185f0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
18600 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
18610 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
18620 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
18630 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
18640 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
18650 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
18660 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
18670 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
18680 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
18690 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
186a0 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
186b0 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
186c0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
186d0 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
186e0 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
186f0 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
18700 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
18710 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
18720 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
18730 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69   specificly, thi
18740 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
18750 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
18760 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ze the database 
18770 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  so .** that the 
18780 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
18790 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
187a0 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e  in use is no lon
187b0 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
187c0 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e  * Parameter nFin
187d0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
187e0 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69  f pages that thi
187f0 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64  s database would
18800 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65   contain.** were
18810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
18820 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72  alled until it r
18830 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
18840 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  NE..**.** If the
18850 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74   bCommit paramet
18860 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
18870 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
18880 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a  sumes that the .
18890 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  ** caller will k
188a0 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
188b0 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
188c0 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
188d0 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72  LITE_DONE .** or
188e0 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d   an error. bComm
188f0 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75  it is passed tru
18900 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  e for an auto-va
18910 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74 20  cuum-on-commmit 
18920 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  .** operation, o
18930 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69  r false for an i
18940 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
18950 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
18960 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
18970 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
18980 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
18990 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d  LastPg, int bCom
189a0 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  mit){.  Pgno nFr
189b0 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
189c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
189d0 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
189e0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
189f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
18a00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18a10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
18a20 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
18a30 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
18a40 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
18a50 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
18a60 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
18a70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
18a80 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
18a90 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
18aa0 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
18ab0 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
18ac0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18ad0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
18ae0 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
18af0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
18b00 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
18b10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
18b20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
18b30 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
18b40 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
18b50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18b60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
18b70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18b80 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
18b90 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
18ba0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18bb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18bc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
18bd0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
18be0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
18bf0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
18c00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
18c10 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
18c20 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
18c30 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
18c40 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
18c50 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69      ** if bCommi
18c60 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t is non-zero. I
18c70 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
18c80 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
18c90 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
18ca0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
18cb0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
18cc0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
18cd0 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
18ce0 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
18cf0 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
18d00 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
18d10 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
18d20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
18d30 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
18d40 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
18d50 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
18d60 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
18d70 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
18d80 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
18d90 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41  tPg, BTALLOC_EXA
18da0 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CT);.        if(
18db0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
18dd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
18de0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18df0 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
18e00 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
18e10 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
18e20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18e30 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
18e40 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
18e50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18e60 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
18e70 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
18e80 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
18e90 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20  e *pLastPg;.    
18ea0 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41    u8 eMode = BTA
18eb0 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d  LLOC_ANY;   /* M
18ec0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f  ode parameter fo
18ed0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
18ee0 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50  age() */.      P
18ef0 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20  gno iNear = 0;  
18f00 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72           /* near
18f10 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  by parameter for
18f20 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
18f30 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ge() */..      r
18f40 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
18f50 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
18f60 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
18f70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18f90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18fa0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
18fb0 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c  bCommit is zero,
18fc0 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
18fd0 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
18fe0 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
18ff0 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
19000 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
19010 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
19020 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
19030 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
19040 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
19050 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f  her hand, if bCo
19060 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20  mmit is greater 
19070 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
19080 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
19090 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
190a0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
190b0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
190c0 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
190d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
190e0 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
190f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43   */.      if( bC
19100 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
19110 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c      eMode = BTAL
19120 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  LOC_LE;.        
19130 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20  iNear = nFin;.  
19140 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b      }.      do {
19150 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
19160 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
19170 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
19180 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
19190 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
191a0 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29  g, iNear, eMode)
191b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
191c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
191d0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
191e0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
191f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
19200 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
19210 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19220 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
19230 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69    }while( bCommi
19240 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  t && iFreePg>nFi
19250 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
19260 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
19270 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
19280 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
19290 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
192a0 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
192b0 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f  ge, iFreePg, bCo
192c0 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c  mmit);.      rel
192d0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
192e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
192f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19300 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19320 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69   }..  if( bCommi
19330 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b  t==0 ){.    do {
19340 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
19350 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c  ;.    }while( iL
19360 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
19370 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c  YTE_PAGE(pBt) ||
19380 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
19390 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a  Bt, iLastPg) );.
193a0 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
193b0 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42  cate = 1;.    pB
193c0 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74  t->nPage = iLast
193d0 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Pg;.  }.  return
193e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
193f0 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
19400 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
19410 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
19420 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
19430 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72   database.** nOr
19440 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ig pages in size
19450 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65   containing nFre
19460 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65  e free pages. Re
19470 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65  turn the expecte
19480 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  d .** size of th
19490 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
194a0 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ges following an
194b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65   auto-vacuum ope
194c0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
194d0 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69  c Pgno finalDbSi
194e0 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ze(BtShared *pBt
194f0 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67  , Pgno nOrig, Pg
19500 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74  no nFree){.  int
19510 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19530 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
19540 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
19550 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  page */.  Pgno n
19560 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20  Ptrmap;         
19570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19580 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
19590 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
195a0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  */.  Pgno nFin; 
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
195d0 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72  alue */..  nEntr
195e0 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
195f0 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70  ize/5;.  nPtrmap
19600 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
19610 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
19620 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
19630 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e  )/nEntry;.  nFin
19640 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
19650 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66   - nPtrmap;.  if
19660 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
19670 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
19680 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
19690 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
196a0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
196b0 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50  .  while( PTRMAP
196c0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
196d0 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
196e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
196f0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
19700 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
19710 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  nFin;.}../*.** A
19720 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
19730 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
19740 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
19750 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
19760 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
19770 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
19780 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
19790 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
197a0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
197b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
197c0 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
197d0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
197e0 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
197f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
19800 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
19810 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
19820 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
19830 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
19840 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
19850 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
19860 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
19870 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
19880 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
19890 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
198a0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
198b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
198c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
198d0 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
198e0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
198f0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
19900 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
19910 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
19920 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
19930 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
19940 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
19950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
19960 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50  o nOrig = btreeP
19970 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
19980 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20     Pgno nFree = 
19990 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
199a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
199b0 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
199c0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
199d0 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
199e0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  );..    if( nOri
199f0 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  g<nFin ){.      
19a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19a10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
19a20 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20  lse if( nFree>0 
19a30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
19a40 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
19a50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
19a60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19a70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
19a80 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
19a90 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
19aa0 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
19ab0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
19ac0 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
19ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19ae0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19af0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
19b00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
19b10 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
19b20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
19b30 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
19b40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
19b50 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
19b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
19b70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19b80 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
19b90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
19ba0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19bc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
19bd0 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
19be0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
19bf0 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
19c00 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
19c10 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61  mmitted for an a
19c20 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
19c30 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
19c40 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
19c50 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
19c60 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
19c70 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
19c80 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19c90 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
19ca0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
19cb0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
19cc0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
19cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
19ce0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
19cf0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
19d00 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
19d10 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
19d20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
19d30 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
19d40 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
19d50 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
19d60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
19d70 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
19d80 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
19d90 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
19da0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
19db0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
19dc0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
19dd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19de0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19df0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
19e00 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
19e10 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
19e20 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
19e30 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
19e40 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
19e50 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
19e60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19e70 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
19e80 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
19e90 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
19ea0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
19eb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
19ec0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
19ed0 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
19ee0 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
19ef0 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
19f00 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
19f10 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
19f20 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
19f30 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
19f40 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
19f50 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
19f60 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
19f70 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
19f80 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
19f90 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
19fa0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19fb0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
19fc0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
19fd0 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
19fe0 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
19ff0 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
1a000 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
1a010 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
1a020 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
1a030 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
1a040 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
1a050 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1a060 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
1a070 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1a080 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1a090 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a0a0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1a0b0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1a0c0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1a0d0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
1a0e0 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1a0f0 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1a100 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
1a110 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
1a120 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1a130 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
1a140 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
1a150 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1a160 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1a170 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
1a180 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
1a190 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
1a1a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
1a1b0 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
1a1c0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1a1d0 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
1a1e0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1a1f0 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
1a200 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
1a210 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
1a220 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1a230 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1a240 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1a250 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
1a260 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1a270 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1a280 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1a290 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1a2a0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
1a2b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1a2c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1a2d0 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
1a2e0 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
1a2f0 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
1a300 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
1a310 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
1a320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a330 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a340 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
1a350 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1a360 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
1a370 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
1a380 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
1a390 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a3a0 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
1a3b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a3c0 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
1a3d0 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
1a3e0 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
1a3f0 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
1a400 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1a410 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
1a420 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
1a430 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
1a440 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
1a450 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
1a460 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
1a470 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
1a480 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
1a490 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
1a4a0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
1a4b0 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
1a4c0 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
1a4d0 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
1a4e0 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
1a4f0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
1a500 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
1a510 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
1a520 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
1a530 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
1a540 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
1a550 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
1a560 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
1a570 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
1a580 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
1a590 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
1a5a0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
1a5b0 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
1a5c0 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
1a5d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
1a5e0 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
1a5f0 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
1a600 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
1a610 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a620 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
1a630 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
1a640 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
1a650 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
1a660 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
1a670 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
1a680 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
1a690 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1a6a0 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
1a6b0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1a6c0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
1a6d0 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
1a6e0 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
1a6f0 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
1a700 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
1a710 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1a720 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
1a730 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
1a740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a750 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
1a760 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
1a770 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
1a780 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
1a790 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1a7a0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1a7b0 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
1a7c0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
1a7d0 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
1a7e0 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
1a7f0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
1a800 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
1a810 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1a820 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
1a830 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
1a840 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
1a850 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
1a860 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
1a870 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
1a880 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
1a890 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
1a8a0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
1a8b0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
1a8c0 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
1a8d0 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
1a8e0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
1a8f0 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
1a900 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
1a910 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
1a920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a930 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
1a940 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
1a950 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a960 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
1a970 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1a980 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
1a990 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a9a0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a9b0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a9c0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1a9d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a9e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a9f0 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
1aa00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1aa10 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
1aa20 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1aa30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
1aa40 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
1aa50 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1aa60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1aa70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1aa80 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1aa90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1aaa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1aab0 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
1aac0 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1aad0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1aae0 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
1aaf0 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
1ab00 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1ab10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ab20 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1ab30 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
1ab40 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
1ab50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1ab60 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1ab70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ab80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ab90 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
1aba0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
1abb0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
1abc0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
1abd0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
1abe0 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
1abf0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1ac00 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
1ac10 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
1ac20 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
1ac30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1ac40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1ac50 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
1ac60 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1ac70 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
1ac80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ac90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
1aca0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1acb0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
1acc0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1acd0 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
1ace0 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
1acf0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1ad00 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
1ad10 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
1ad20 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
1ad30 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
1ad40 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
1ad50 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
1ad60 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
1ad70 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
1ad80 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
1ad90 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
1ada0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1adb0 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
1adc0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1add0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1ade0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1adf0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
1ae00 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
1ae10 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
1ae20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
1ae30 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
1ae40 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
1ae50 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1ae60 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
1ae70 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
1ae80 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1ae90 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
1aea0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
1aeb0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1aec0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
1aed0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
1aee0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
1aef0 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
1af00 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
1af10 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1af20 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
1af30 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
1af40 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1af50 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
1af60 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
1af70 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
1af80 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1af90 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
1afa0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1afb0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1afc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1afd0 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
1afe0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1aff0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1b000 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
1b010 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
1b020 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
1b030 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
1b040 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
1b050 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
1b060 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1b070 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
1b080 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1b090 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
1b0a0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1b0b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1b0c0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1b0d0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
1b0e0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
1b0f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
1b100 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
1b110 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
1b120 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1b130 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
1b140 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1b150 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
1b160 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
1b170 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
1b180 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
1b190 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1b1a0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
1b1b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1b1c0 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
1b1d0 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
1b1e0 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
1b1f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
1b200 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
1b210 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
1b220 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
1b230 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
1b240 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
1b250 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
1b260 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
1b270 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
1b280 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
1b290 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
1b2a0 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
1b2b0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
1b2c0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
1b2d0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
1b2e0 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
1b2f0 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
1b300 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
1b310 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1b320 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1b330 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
1b340 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
1b350 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
1b360 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
1b370 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1b380 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
1b390 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
1b3a0 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
1b3b0 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
1b3c0 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
1b3d0 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
1b3e0 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
1b3f0 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
1b400 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
1b410 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
1b420 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1b430 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1b440 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1b450 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1b460 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
1b470 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
1b480 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
1b490 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
1b4a0 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
1b4b0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
1b4c0 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
1b4d0 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
1b4e0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
1b4f0 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
1b500 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
1b510 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
1b520 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
1b530 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
1b540 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1b550 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
1b560 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
1b570 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
1b580 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
1b590 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
1b5a0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
1b5b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1b5c0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1b5d0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1b5e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1b5f0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1b600 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1b610 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1b620 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1b630 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b640 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b650 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
1b660 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
1b670 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1b680 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
1b690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b6a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b6b0 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
1b6c0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
1b6d0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1b6e0 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
1b6f0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
1b700 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
1b710 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
1b720 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
1b730 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1b740 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
1b750 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1b760 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1b770 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1b780 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
1b790 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1b7a0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1b7b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1b7c0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1b7d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1b7e0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
1b7f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b800 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b810 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
1b820 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1b830 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
1b840 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
1b850 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b860 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
1b870 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1b880 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1b890 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1b8a0 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
1b8b0 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
1b8c0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1b8d0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1b8e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b8f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b910 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
1b920 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
1b930 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b940 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
1b950 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1b960 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b970 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1b980 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b990 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
1b9a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1b9b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1b9c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1b9d0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
1b9e0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
1b9f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1ba00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ba10 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ba20 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
1ba30 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
1ba40 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
1ba50 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
1ba60 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
1ba70 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20  sor on BtShared 
1ba80 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
1ba90 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
1baa0 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
1bab0 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
1bac0 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74  ing cursors that
1bad0 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74   belong.** to ot
1bae0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1baf0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
1bb00 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69  ppen to be shari
1bb10 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  ng.** the cache 
1bb20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
1bb30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bb40 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
1bb50 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1bb60 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  rs..** All curso
1bb70 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  rs using the sam
1bb80 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  e cache must be 
1bb90 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72  tripped.** to pr
1bba0 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
1bbb0 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
1bbc0 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a  e btree after.**
1bbd0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20   the rollback.  
1bbe0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1bbf0 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61   have deleted ta
1bc00 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64  bles.** or moved
1bc10 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20   root pages, so 
1bc20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
1bc30 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20  ient to.** save 
1bc40 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1bc50 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75   cursor.  The cu
1bc60 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  rsor must be.** 
1bc70 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
1bc80 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1bc90 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
1bca0 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
1bcb0 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42  nt errCode){.  B
1bcc0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66  tCursor *p;.  if
1bcd0 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72 65  ( pBtree==0 ) re
1bce0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  turn;.  sqlite3B
1bcf0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1bd00 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
1bd10 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
1bd20 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1bd30 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1bd40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1bd50 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
1bd60 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
1bd70 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
1bd80 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
1bd90 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
1bda0 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
1bdb0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1bdc0 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
1bdd0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
1bde0 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
1bdf0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1be00 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1be10 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
1be20 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
1be30 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1be40 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
1be50 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
1be60 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
1be70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
1be80 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
1be90 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
1bea0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
1beb0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
1bec0 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
1bed0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
1bee0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
1bef0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1bf00 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1bf10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1bf20 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1bf30 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1bf40 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1bf50 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1bf60 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1bf70 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
1bf80 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ck(Btree *p, int
1bf90 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e   tripCode){.  in
1bfa0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1bfb0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1bfc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1bfd0 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1;..  sqlite3Btr
1bfe0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
1bff0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
1c000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1c010 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
1c020 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1c030 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, 0);.  }else{
1c040 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c050 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
1c060 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 73  ripCode ){.    s
1c070 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1c080 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69  llCursors(p, tri
1c090 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62 74  pCode);.  }.  bt
1c0a0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1c0b0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1c0c0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1c0d0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
1c0e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
1c0f0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
1c100 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
1c110 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
1c120 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1c130 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1c140 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
1c150 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1c160 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
1c170 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
1c180 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
1c190 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
1c1a0 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
1c1b0 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
1c1c0 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
1c1d0 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
1c1e0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
1c1f0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
1c200 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
1c210 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
1c220 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
1c230 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
1c240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c250 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
1c260 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
1c270 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
1c280 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
1c290 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
1c2a0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
1c2b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1c2c0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1c2d0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
1c2e0 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
1c2f0 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
1c300 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1c310 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
1c320 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1c330 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
1c340 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
1c350 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
1c360 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
1c370 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1c380 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1c390 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1c3a0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1c3b0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1c3c0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1c3d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c3e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c3f0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
1c400 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
1c410 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1c420 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
1c430 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
1c440 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
1c450 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
1c460 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
1c470 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
1c480 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
1c490 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
1c4a0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1c4b0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1c4c0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
1c4d0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
1c4e0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1c4f0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
1c500 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
1c510 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
1c520 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
1c530 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
1c540 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
1c550 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
1c560 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
1c570 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
1c580 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
1c590 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
1c5a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
1c5b0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
1c5c0 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
1c5d0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
1c5e0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
1c5f0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
1c600 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
1c610 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
1c620 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1c630 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
1c640 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
1c650 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1c660 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
1c670 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
1c680 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
1c690 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1c6a0 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
1c6b0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
1c6c0 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
1c6d0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
1c6e0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1c6f0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
1c700 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
1c710 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1c720 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
1c730 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
1c740 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
1c750 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
1c760 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
1c770 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
1c780 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
1c790 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
1c7a0 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
1c7b0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1c7c0 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
1c7d0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1c7e0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
1c7f0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
1c800 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
1c810 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1c820 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1c830 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1c840 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1c850 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
1c860 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1c870 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
1c880 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1c890 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
1c8a0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1c8b0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
1c8c0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
1c8d0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
1c8e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1c8f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1c900 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1c910 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
1c920 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
1c930 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1c940 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
1c950 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
1c960 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
1c970 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
1c980 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
1c990 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
1c9a0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
1c9b0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
1c9c0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
1c9d0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
1c9e0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
1c9f0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
1ca00 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1ca10 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
1ca20 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
1ca30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1ca40 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1ca50 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
1ca60 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
1ca70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1ca80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ca90 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1caa0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1cab0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
1cac0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
1cad0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
1cae0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1caf0 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
1cb00 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
1cb10 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
1cb20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
1cb30 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1cb40 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
1cb50 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
1cb60 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
1cb70 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
1cb80 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
1cb90 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1cba0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1cbb0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
1cbc0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
1cbd0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
1cbe0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
1cbf0 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
1cc00 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
1cc10 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1cc20 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1cc30 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
1cc40 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
1cc50 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
1cc60 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
1cc70 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
1cc80 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
1cc90 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
1cca0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
1ccb0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
1ccc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ccd0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
1cce0 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1ccf0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
1cd00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cd10 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
1cd20 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1cd30 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1cd40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1cd50 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1cd60 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1cd70 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
1cd80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1cd90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1cda0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
1cdb0 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
1cdc0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
1cdd0 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
1cde0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1cdf0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
1ce00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
1ce10 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1ce20 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
1ce30 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
1ce40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ce50 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
1ce60 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
1ce70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
1ce80 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
1ce90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
1cea0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
1ceb0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1cec0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1ced0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1cee0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
1cef0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
1cf00 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
1cf10 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
1cf20 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
1cf30 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
1cf40 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
1cf50 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
1cf60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1cf70 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
1cf80 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
1cf90 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
1cfa0 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
1cfb0 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
1cfc0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
1cfd0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
1cfe0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1cff0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1d000 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1d010 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
1d020 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
1d030 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
1d040 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
1d050 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
1d060 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
1d070 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1d080 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
1d090 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
1d0a0 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
1d0b0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1d0c0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
1d0d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1d0e0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
1d0f0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
1d100 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
1d110 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1d120 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
1d130 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
1d140 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1d150 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
1d160 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1d170 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
1d180 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
1d190 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
1d1a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1d1b0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1d1c0 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
1d1d0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
1d1e0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
1d1f0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
1d200 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
1d210 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
1d220 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
1d230 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
1d240 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
1d250 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
1d260 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
1d270 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
1d280 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
1d290 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
1d2a0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1d2b0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
1d2c0 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
1d2d0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
1d2e0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
1d2f0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
1d300 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
1d310 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
1d320 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
1d330 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
1d340 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
1d350 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
1d360 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
1d370 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
1d380 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
1d390 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
1d3a0 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
1d3b0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
1d3c0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1d3d0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
1d3e0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
1d3f0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
1d400 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
1d410 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
1d420 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
1d430 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
1d440 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
1d450 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
1d460 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
1d470 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
1d480 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
1d490 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
1d4a0 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
1d4b0 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
1d4c0 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
1d4d0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
1d4e0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
1d4f0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
1d500 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
1d510 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
1d520 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
1d530 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
1d540 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1d550 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
1d560 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1d570 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1d580 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1d590 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1d5a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1d5d0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1d600 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1d610 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1d620 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1d650 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1d660 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1d670 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1d680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1d690 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
1d6a0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1d6b0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1d6c0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1d6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1d6e0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1d6f0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1d700 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1d710 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1d720 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1d730 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1d740 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1d750 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1d760 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1d770 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1d780 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1d790 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1d7a0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1d7b0 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1d7c0 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1d7d0 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1d7e0 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1d7f0 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1d800 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1d810 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1d820 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1d830 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1d840 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1d850 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1d860 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1d870 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1d880 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1d890 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1d8a0 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1d8b0 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1d8c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1d8d0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1d8e0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1d8f0 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1d900 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1d910 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1d920 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1d930 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1d940 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1d950 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1d960 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1d970 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1d980 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1d9a0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1d9b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1d9c0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1d9d0 77 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e  wrFlag && (pBt->
1d9e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1d9f0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b  EAD_ONLY)!=0) ){
1da00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1da10 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1da20 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1da30 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
1da40 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1da50 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1da60 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
1da70 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1da80 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1da90 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1daa0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1dab0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1dac0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1dad0 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1dae0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1daf0 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1db00 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1db10 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1db20 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1db30 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1db40 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1db50 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1db60 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1db70 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73  >pBt = pBt;.  as
1db80 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1db90 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f  || wrFlag==BTCF_
1dba0 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70  WriteFlag );.  p
1dbb0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
1dbc0 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
1dbd0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
1dbe0 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
1dbf0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1dc00 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1dc10 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
1dc20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1dc30 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
1dc40 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1dc50 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
1dc60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1dc70 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1dc80 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1dcc0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1dd00 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1dd10 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dd40 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1dd50 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1dd60 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1dd70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1dd80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1dd90 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
1dda0 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
1ddb0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1dde0 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
1ddf0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1de00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1de10 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
1de20 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
1de30 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
1de40 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
1de50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1de60 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1de70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1de80 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1de90 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1dea0 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
1deb0 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
1dec0 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
1ded0 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
1dee0 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
1def0 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
1df00 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
1df10 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
1df20 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
1df30 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
1df40 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
1df50 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
1df60 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
1df70 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
1df80 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
1df90 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
1dfa0 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1dfb0 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
1dfc0 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
1dfd0 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
1dfe0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1dff0 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1e000 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1e010 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
1e020 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
1e030 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
1e040 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
1e050 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
1e060 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
1e070 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
1e080 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
1e090 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
1e0a0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
1e0b0 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
1e0c0 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
1e0d0 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
1e0e0 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
1e0f0 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
1e100 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
1e110 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1e120 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
1e130 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
1e140 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1e150 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
1e160 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1e170 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
1e180 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
1e190 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
1e1a0 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
1e1b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1e1c0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
1e1d0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
1e1e0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
1e1f0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
1e200 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
1e210 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
1e220 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
1e230 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
1e240 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
1e250 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
1e260 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
1e270 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1e280 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1e290 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1e2a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1e2b0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1e2c0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
1e2d0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
1e2e0 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
1e2f0 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
1e300 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1e310 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
1e320 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
1e330 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e340 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1e350 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1e360 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
1e370 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
1e380 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1e390 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1e3a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e3b0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1e3c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
1e3d0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1e3e0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
1e3f0 65 33 44 62 46 72 65 65 28 70 42 74 72 65 65 2d  e3DbFree(pBtree-
1e400 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72  >db, pCur->aOver
1e410 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71  flow);.    /* sq
1e420 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1e430 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1e440 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1e450 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1e460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1e470 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1e480 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
1e490 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1e4a0 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
1e4b0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1e4c0 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
1e4d0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1e4e0 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
1e4f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1e500 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
1e510 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
1e520 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
1e530 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
1e540 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
1e550 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
1e560 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
1e570 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1e580 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
1e590 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
1e5a0 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
1e5b0 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
1e5c0 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
1e5d0 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
1e5e0 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
1e5f0 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
1e600 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
1e610 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1e620 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
1e630 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
1e640 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
1e650 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
1e660 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
1e670 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
1e680 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
1e690 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
1e6a0 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
1e6b0 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
1e6c0 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
1e6d0 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
1e6e0 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
1e6f0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
1e700 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
1e710 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
1e720 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
1e730 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
1e740 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1e750 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1e760 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
1e770 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1e780 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1e790 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1e7a0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1e7b0 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
1e7c0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
1e7d0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1e7e0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1e7f0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1e800 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
1e810 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
1e820 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65  CORRUPT_DB || me
1e830 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1e840 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1e850 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1e860 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1e870 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1e880 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1e890 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1e8a0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1e8b0 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1e8c0 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1e8d0 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1e8e0 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1e8f0 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1e900 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e910 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1e920 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1e930 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1e940 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1e950 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1e960 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1e970 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1e980 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1e990 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
1e9a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
1e9b0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
1e9c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e9d0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1e9e0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1e9f0 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1ea00 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1ea10 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1ea20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1ea30 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1ea40 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1ea50 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1ea60 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1eab0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1eac0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1eb00 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1eb10 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1eb50 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1eb60 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1eb70 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1eb80 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1eb90 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70  ;        \.    p
1eba0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
1ebb0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
1ebf0 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1ec40 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1ec50 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1ec90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
1eca0 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  _VER */..#ifndef
1ecb0 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
1ecc0 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
1ecd0 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1ece0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1ecf0 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
1ed00 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
1ed10 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
1ed20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
1ed30 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
1ed40 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
1ed50 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
1ed60 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
1ed70 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
1ed80 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
1ed90 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
1eda0 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
1edb0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1edc0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
1edd0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1ede0 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
1edf0 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1ee00 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
1ee10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ee20 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
1ee30 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
1ee40 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1ee50 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1ee60 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
1ee70 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
1ee80 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
1ee90 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1eea0 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
1eeb0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
1eec0 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
1eed0 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
1eee0 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
1eef0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
1ef00 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
1ef10 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
1ef20 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ef30 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
1ef40 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
1ef50 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1ef60 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1ef70 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f  e caller must po
1ef80 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
1ef90 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  r prior to invok
1efa0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1efb0 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
1efc0 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
1efd0 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  l.  It always re
1efe0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1eff0 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
1f000 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
1f010 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
1f020 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  4 *pSize){.  ass
1f030 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1f040 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1f050 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1f060 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1f070 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
1f080 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f090 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
1f0a0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1f0b0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
1f0c0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pSize = 0;.  }el
1f0d0 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49  se{.    getCellI
1f0e0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a  nfo(pCur);.    *
1f0f0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1f100 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72  fo.nKey;.  }.  r
1f110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1f130 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1f140 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1f150 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1f160 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1f170 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1f180 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
1f190 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
1f1a0 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
1f1b0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1f1c0 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
1f1d0 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
1f1e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1f1f0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1f200 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
1f210 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
1f220 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
1f230 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
1f240 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
1f250 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1f260 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
1f270 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
1f280 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1f290 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
1f2a0 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
1f2b0 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
1f2c0 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
1f2d0 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
1f2e0 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1f2f0 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
1f300 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
1f310 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
1f320 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1f330 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1f340 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1f350 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1f360 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1f370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f380 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f390 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
1f3a0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1f3b0 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1f3c0 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65  info.nData;.  re
1f3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f3e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1f3f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1f400 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
1f410 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1f420 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
1f430 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
1f440 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
1f450 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1f460 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1f470 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
1f480 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
1f490 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
1f4a0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
1f4b0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
1f4c0 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
1f4d0 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
1f4e0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
1f4f0 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
1f500 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
1f510 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1f520 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f530 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1f540 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
1f550 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
1f560 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
1f570 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1f580 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1f590 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
1f5a0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
1f5b0 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
1f5c0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
1f5d0 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
1f5e0 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
1f5f0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
1f600 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
1f610 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
1f620 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1f630 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
1f640 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
1f650 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
1f660 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
1f670 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
1f680 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
1f690 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
1f6a0 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
1f6b0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1f6c0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1f6d0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
1f6e0 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
1f6f0 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
1f700 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
1f710 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
1f720 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
1f730 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
1f740 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
1f750 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
1f760 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
1f770 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
1f780 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
1f790 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1f7a0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1f7b0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1f7c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f7d0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f7e0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1f7f0 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
1f800 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1f810 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1f820 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
1f830 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1f840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1f850 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
1f860 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
1f870 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
1f880 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
1f890 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
1f8a0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
1f8b0 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
1f8c0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
1f8d0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
1f8e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f8f0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1f900 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f910 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1f920 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
1f930 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
1f940 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f950 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
1f960 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
1f970 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
1f980 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
1f990 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
1f9a0 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
1f9b0 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
1f9c0 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
1f9d0 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
1f9e0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
1f9f0 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
1fa00 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
1fa10 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
1fa20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
1fa30 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
1fa40 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
1fa50 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
1fa60 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
1fa70 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
1fa80 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
1fa90 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1faa0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1fab0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
1fac0 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
1fad0 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
1fae0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
1faf0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1fb00 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
1fb10 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
1fb20 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1fb30 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
1fb40 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
1fb50 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
1fb60 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
1fb70 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1fb80 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
1fb90 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
1fba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fbb0 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
1fbc0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1fbd0 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
1fbe0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
1fbf0 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
1fc00 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1fc10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fc20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1fc30 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
1fc40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1fc50 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1fc60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1fc70 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1fc80 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
1fc90 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
1fca0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
1fcb0 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
1fcc0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1fcd0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
1fce0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1fcf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fd00 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
1fd10 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1fd20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
1fd30 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
1fd40 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
1fd50 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
1fd60 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
1fd70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1fd80 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
1fd90 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
1fda0 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
1fdb0 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
1fdc0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1fdd0 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
1fde0 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
1fdf0 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
1fe00 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
1fe10 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1fe20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
1fe30 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1fe40 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
1fe50 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
1fe60 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
1fe70 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
1fe80 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
1fe90 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
1fea0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
1feb0 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
1fec0 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
1fed0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1fee0 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1fef0 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
1ff00 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
1ff10 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1ff20 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1ff30 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
1ff40 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
1ff50 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
1ff60 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
1ff70 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
1ff80 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
1ff90 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
1ffa0 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
1ffb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1ffc0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
1ffd0 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
1ffe0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1fff0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
20000 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
20010 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
20020 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20030 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
20040 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
20070 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
20080 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
20090 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
200a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
200b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
200c0 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
200d0 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
200e0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
200f0 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
20100 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
20110 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
20120 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20130 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
20140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
20160 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20170 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
20180 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
20190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
201a0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
201b0 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
201c0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
201d0 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
201e0 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
201f0 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
20200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20210 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20220 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
20230 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
20240 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
20250 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
20260 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
20270 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
20280 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
20290 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
202a0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
202b0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
202c0 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
202d0 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
202e0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
202f0 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
20300 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
20310 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
20320 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
20330 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
20340 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
20350 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
20360 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
20370 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
20380 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
20390 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
203a0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
203b0 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
203c0 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
203d0 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
203e0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
203f0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
20400 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
20410 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
20420 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
20430 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
20440 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
20450 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
20460 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
20470 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
20480 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
20490 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
204a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
204b0 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
204c0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
204d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
204e0 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
204f0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
20500 79 20 0a 2a 2a 20 70 6f 70 6c 75 61 74 65 73 20  y .** popluates 
20510 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
20520 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
20530 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
20540 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
20550 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
20560 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
20570 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
20580 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
20590 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
205a0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
205b0 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
205c0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
205d0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
205e0 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
205f0 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
20600 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
20610 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
20620 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
20630 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
20640 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
20650 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
20660 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
20670 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
20680 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
20690 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
206a0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
206b0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
206c0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
206d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
206e0 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
206f0 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
20700 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
20710 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
20720 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
20730 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
20740 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
20750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
20760 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
20770 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
20780 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
20790 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
207a0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
207b0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
207c0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
207d0 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
207e0 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
207f0 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
20800 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
20810 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
20820 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
20830 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
20840 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
20850 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
20860 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
20870 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
20880 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
20890 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
208a0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
208b0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
208c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
208d0 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
208e0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
208f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
20900 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
20910 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
20920 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
20930 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
20940 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20950 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20970 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
20980 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
20990 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
209a0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
209b0 41 44 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  AD.  int bEnd;  
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
209f0 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61  ing to end of da
20a00 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ta */.#endif..  
20a10 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
20a20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20a30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20a40 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
20a50 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20a60 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
20a70 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
20a80 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20a90 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20aa0 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
20ab0 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b   || offset==0 );
20ac0 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20        /* Always 
20ad0 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e  start from begin
20ae0 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20  ning for eOp==2 
20af0 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  */..  getCellInf
20b00 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
20b10 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
20b20 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
20b30 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
20b40 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
20b50 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
20b60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
20b70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20b80 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
20b90 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 28 6f  READ.  bEnd = (o
20ba0 66 66 73 65 74 2b 61 6d 74 3d 3d 6e 4b 65 79 2b  ffset+amt==nKey+
20bb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
20bc0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
20bd0 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d   NEVER(offset+am
20be0 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
20bf0 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c  nfo.nData) .   |
20c00 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  | &aPayload[pCur
20c10 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
20c20 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
20c30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
20c40 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69    ){.    /* Tryi
20c50 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
20c60 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
20c70 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
20c80 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
20c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20ca0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
20cb0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
20cc0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
20cd0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
20ce0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
20cf0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
20d00 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
20d10 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
20d20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
20d30 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
20d40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
20d50 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
20d60 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20d70 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
20d80 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
20d90 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
20da0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
20db0 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70   (eOp & 0x01), p
20dc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
20dd0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
20de0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
20df0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
20e00 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
20e10 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
20e20 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
20e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20e40 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
20e50 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
20e60 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
20e70 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
20e80 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
20e90 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
20ea0 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
20eb0 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
20ec0 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
20ed0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
20ee0 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
20ef0 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
20f00 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
20f10 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
20f20 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
20f30 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  now..    ** Exce
20f40 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63  pt, do not alloc
20f50 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  ate aOverflow[] 
20f60 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20  for eOp==2..    
20f70 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
20f80 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
20f90 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
20fa0 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
20fb0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
20fc0 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
20fd0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
20fe0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
20ff0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
21000 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
21010 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
21020 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
21030 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
21040 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
21050 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
21060 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
21070 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
21080 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
21090 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
210a0 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d  eOp!=2 && (pCur-
210b0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
210c0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
210d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
210e0 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
210f0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
21100 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
21110 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
21120 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
21130 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f  >pCur->nOvflAllo
21140 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  c ){.        Pgn
21150 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a  o *aNew = (Pgno*
21160 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f  )sqlite3DbReallo
21170 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
21180 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2c  Cur->pBtree->db,
21190 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
211a0 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66  , nOvfl*2*sizeof
211b0 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  (Pgno).        )
211c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ;.        if( aN
211d0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
211e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
211f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65  OMEM;.        }e
21200 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
21210 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
21220 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20  = nOvfl*2;.     
21230 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
21240 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
21250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21260 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21280 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61    memset(pCur->a
21290 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76  Overflow, 0, nOv
212a0 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29  fl*sizeof(Pgno))
212b0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
212c0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
212d0 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
212e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
212f0 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
21300 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
21310 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
21320 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
21330 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
21340 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
21350 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
21360 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
21370 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
21380 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
21390 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
213a0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
213b0 4f 76 66 6c 29 21 3d 30 20 26 26 20 70 43 75 72  Ovfl)!=0 && pCur
213c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
213d0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
213e0 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
213f0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
21400 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
21410 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
21420 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
21430 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
21440 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
21450 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
21460 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
21470 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
21480 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20  iIdx++){..      
21490 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
214a0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate 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 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
214d0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
214e0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
214f0 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)!=0 ){.    
21500 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
21510 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
21520 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
21530 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
21540 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
21550 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
21560 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
21570 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21580 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
21590 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
215a0 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
215b0 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
215c0 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
215d0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
215e0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
215f0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
21600 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
21610 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
21620 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
21630 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
21640 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
21650 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
21660 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
21670 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
21680 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
21690 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
216a0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
216b0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
216c0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
216d0 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
216e0 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c  that the aOverfl
216f0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20  ow[] array must 
21700 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63  be allocated bec
21710 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20  ause eOp!=2.    
21720 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66      ** here.  If
21730 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66   eOp==2, then of
21740 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73  fset==0 and this
21750 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72   branch is never
21760 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20   taken..        
21770 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
21780 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20  t( eOp!=2 );.   
21790 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
217a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
217b0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a  CF_ValidOvfl );.
217c0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
217d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
217e0 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
217f0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
21800 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
21810 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1];.        }el
21820 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
21830 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
21840 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
21850 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
21860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21870 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
21880 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
21890 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
218a0 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
218b0 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
218c0 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
218d0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
218e0 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
218f0 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
21900 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
21910 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
21920 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
21930 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
21940 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
21950 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21960 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66  file *fd;.#endif
21970 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
21980 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
21990 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
219a0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
219b0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
219c0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
219d0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
219e0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
219f0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
21a00 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
21a10 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
21a20 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
21a30 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
21a40 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
21a50 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
21a60 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
21a70 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
21a80 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
21a90 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
21aa0 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
21ab0 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74   **   3) the dat
21ac0 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
21ad0 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
21ae0 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20    **   4) there 
21af0 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
21b00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
21b10 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
21b20 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
21b30 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61  s not a WAL data
21b40 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  base,.        **
21b50 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66     6) all data f
21b60 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20  rom the page is 
21b70 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20  being read..    
21b80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
21b90 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
21ba0 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
21bb0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21bc0 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
21bd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
21be0 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
21bf0 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
21c00 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
21c10 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
21c20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
21c30 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
21c40 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
21c50 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
21c60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21c70 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29    if( (eOp&0x01)
21c80 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
21cb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
21cc0 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cf0 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
21d00 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c       && (bEnd ||
21d10 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20   a==ovflSize)   
21d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
21d40 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
21d50 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
21d60 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ion==TRANS_READ 
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
21d90 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20         && (fd = 
21da0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
21db0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e  (pBt->pPager))->
21dc0 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20  pMethods     /* 
21dd0 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
21de0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
21df0 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20  aData[19]==0x01 
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a        /* (5) */.
21e20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
21e30 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
21e40 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
21e50 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
21e60 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  4];.          me
21e70 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69  mcpy(aSave, aWri
21e80 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  te, 4);.        
21e90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21ea0 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c  Read(fd, aWrite,
21eb0 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e   a+4, (i64)pBt->
21ec0 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61  pageSize*(nextPa
21ed0 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ge-1));.        
21ee0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
21ef0 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20  4byte(aWrite);. 
21f00 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
21f10 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34  aWrite, aSave, 4
21f20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21f30 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
21f40 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50   {.          DbP
21f50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
21f60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21f70 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
21f80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
21f90 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
21fa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21fb0 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f  ((eOp&0x01)==0 ?
21fc0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
21fd0 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
21fe0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
21ff0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22000 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
22010 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
22020 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
22030 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
22040 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
22050 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
22060 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
22070 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
22080 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
22090 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
220a0 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50  (eOp&0x01), pDbP
220b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
220c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
220d0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
220e0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
220f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22100 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22110 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
22120 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
22130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22140 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
22150 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
22160 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
22170 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22180 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
22190 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
221a0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
221b0 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
221c0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
221d0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
221e0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
221f0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
22200 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
22210 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
22220 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
22230 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
22240 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
22250 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
22260 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
22270 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
22280 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
22290 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
222a0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
222b0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
222c0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
222d0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
222e0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
222f0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
22300 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
22310 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
22320 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22330 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
22340 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
22350 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
22360 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
22370 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22380 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
22390 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
223a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
223b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
223c0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
223d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
223e0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
223f0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
22400 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
22410 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22420 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
22430 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
22440 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
22450 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
22460 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
22470 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
22480 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
22490 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
224a0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
224b0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
224c0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
224d0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
224e0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
224f0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
22500 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
22510 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
22520 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
22530 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
22540 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
22550 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
22560 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
22570 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
22580 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
22590 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
225a0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
225b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
225c0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
225d0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
225e0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
225f0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
22600 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22610 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
22620 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
22630 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
22640 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
22650 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
22660 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
22670 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22680 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22690 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
226a0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
226b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
226c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
226d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
226e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
226f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22700 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
22710 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22720 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
22730 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22740 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22750 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22760 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22770 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
22780 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
22790 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
227a0 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
227b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
227c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
227d0 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
227e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
227f0 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
22800 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
22810 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
22820 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
22830 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
22840 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
22850 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
22860 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
22870 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
22880 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
22890 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
228a0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
228b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
228c0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
228d0 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
228e0 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
228f0 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
22900 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
22910 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
22920 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
22930 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
22940 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
22950 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
22960 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
22970 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
22980 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
22990 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
229a0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
229b0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
229c0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
229d0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
229e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
229f0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
22a00 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
22a10 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
22a20 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
22a30 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
22a40 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
22a50 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
22a60 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
22a70 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
22a80 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
22a90 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
22aa0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
22ab0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
22ac0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
22ad0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
22ae0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
22af0 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
22b00 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
22b10 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
22b20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22b30 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
22b40 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
22b50 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
22b60 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
22b70 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
22b80 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
22b90 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
22ba0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
22bb0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
22bc0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
22bd0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
22be0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
22bf0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
22c00 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
22c10 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
22c20 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
22c30 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
22c40 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
22c50 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
22c60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
22c70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22c80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22c90 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
22ca0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22cb0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
22cc0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
22cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
22ce0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22cf0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
22d00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22d10 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
22d20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22d30 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
22d40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
22d50 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20  fo.nSize>0 );.  
22d60 2a 70 41 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e  *pAmt = pCur->in
22d70 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74  fo.nLocal;.  ret
22d80 75 72 6e 20 28 76 6f 69 64 2a 29 28 70 43 75 72  urn (void*)(pCur
22d90 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
22da0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
22db0 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  r);.}.../*.** Fo
22dc0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
22dd0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
22de0 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
22df0 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
22e00 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
22e10 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
22e20 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
22e30 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
22e40 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
22e50 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
22e60 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
22e70 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
22e80 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
22e90 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
22ea0 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
22eb0 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
22ec0 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
22ed0 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
22ee0 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
22ef0 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
22f00 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
22f10 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
22f20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
22f30 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
22f40 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
22f50 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
22f60 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
22f70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
22f80 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
22f90 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
22fa0 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
22fb0 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
22fc0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
22fd0 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
22fe0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
22ff0 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
23000 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
23010 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
23020 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
23030 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
23040 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
23050 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e  ur, pAmt);.}.con
23060 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
23070 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
23080 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
23090 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
230a0 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
230b0 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
230c0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
230d0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
230e0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
230f0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
23100 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
23110 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
23120 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
23130 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
23140 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23150 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
23160 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
23170 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
23180 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
23190 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
231a0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
231b0 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
231c0 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
231d0 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
231e0 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
231f0 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
23200 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
23210 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
23220 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
23230 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
23240 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
23250 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
23260 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
23270 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65   i = pCur->iPage
23280 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
23290 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  wPage;.  BtShare
232a0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
232b0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
232c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
232d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
232e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
232f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23300 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23310 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
23320 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
23330 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
23340 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
23350 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
23360 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
23370 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
23380 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
23390 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
233a0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
233b0 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
233c0 4e 65 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20  NewPage,.       
233d0 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63          (pCur->c
233e0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
233f0 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50  riteFlag)==0 ? P
23400 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
23410 59 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63  Y : 0);.  if( rc
23420 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
23430 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
23440 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
23450 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
23460 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
23470 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
23480 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
23490 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
234a0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
234b0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
234c0 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  vfl);.  if( pNew
234d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  Page->nCell<1 ||
234e0 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65   pNewPage->intKe
234f0 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  y!=pCur->apPage[
23500 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  i]->intKey ){.  
23510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23520 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23530 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
23540 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f  E_OK;.}..#if 0./
23550 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
23560 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
23570 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
23580 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
23590 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
235a0 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
235b0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
235c0 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
235d0 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
235e0 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
235f0 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
23600 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
23610 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
23620 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
23630 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
23640 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
23650 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
23660 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
23670 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
23680 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
23690 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
236a0 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
236b0 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65   iChild){.  asse
236c0 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
236d0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
236e0 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
236f0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
23700 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
23710 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
23720 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
23730 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
23740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
23750 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
23760 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
23770 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
23780 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
23790 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
237a0 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
237b0 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
237c0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
237d0 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
237e0 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
237f0 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
23800 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
23810 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
23820 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
23830 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
23840 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
23850 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
23860 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
23870 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
23880 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
23890 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
238a0 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
238b0 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
238c0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
238d0 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
238e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
238f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23900 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23910 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23920 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23930 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
23940 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
23950 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
23960 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23970 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a  Cur->iPage] );..
23980 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20    /* UPDATE: It 
23990 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
239a0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  ible for the con
239b0 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79  dition tested by
239c0 20 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a   the assert.  **
239d0 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74   below to be unt
239e0 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
239f0 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
23a00 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63  upt. This can oc
23a10 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20  cur if.  ** one 
23a20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66  cursor has modif
23a30 69 65 64 20 70 61 67 65 20 70 50 61 72 65 6e 74  ied page pParent
23a40 20 77 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e   while a referen
23a50 63 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64  ce to it is held
23a60 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f   .  ** by a seco
23a70 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68  nd cursor. Which
23a80 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
23a90 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
23aa0 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a  e is linked.  **
23ab0 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
23ac0 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
23ad0 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70  ture in a corrup
23ae0 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  t database.  */.
23af0 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 50 61  #if 0.  assertPa
23b00 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
23b10 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23b20 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
23b30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23b40 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
23b50 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
23b60 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
23b70 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  o.  );.#endif.  
23b80 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
23b90 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23ba0 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
23bb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
23bc0 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  1]->nCell );..  
23bd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
23be0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23bf0 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
23c00 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
23c10 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23c20 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
23c30 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
23c40 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
23c50 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ovfl);.}../*.** 
23c60 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
23c70 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
23c80 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
23c90 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
23ca0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
23cb0 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
23cc0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
23cd0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
23ce0 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
23cf0 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
23d00 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
23d10 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
23d20 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
23d30 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
23d40 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
23d50 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
23d60 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
23d70 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
23d80 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
23d90 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
23da0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
23db0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
23dc0 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
23dd0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
23de0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
23df0 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
23e00 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
23e10 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
23e20 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
23e30 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
23e40 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
23e50 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
23e60 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
23e70 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
23e80 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
23e90 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
23ea0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
23eb0 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
23ec0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
23ed0 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
23ee0 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
23ef0 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
23f00 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
23f10 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
23f20 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
23f30 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
23f40 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
23f50 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
23f60 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
23f70 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
23f80 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
23f90 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
23fa0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
23fb0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
23fc0 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
23fd0 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
23fe0 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
23ff0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
24000 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
24010 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
24020 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
24030 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
24040 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
24050 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
24060 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
24070 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
24080 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
24090 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
240a0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
240b0 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
240c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
240d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
240e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
240f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
24100 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
24110 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
24120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
24130 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
24140 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
24150 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
24160 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
24170 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
24180 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
24190 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
241a0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
241b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
241c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
241d0 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
241e0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
241f0 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
24200 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
24210 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
24220 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
24230 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
24240 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
24250 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
24260 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
24270 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c  Cur->iPage ) rel
24280 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
24290 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
242a0 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e--]);.  }else i
242b0 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
242c0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
242d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
242e0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
242f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
24310 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
24320 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
24330 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
24340 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
24350 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
24360 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63          (pCur->c
24370 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
24380 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50  riteFlag)==0 ? P
24390 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
243a0 59 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Y : 0);.    if( 
243b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
243c0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
243d0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
243e0 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
243f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
24400 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
24410 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
24420 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
24430 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
24440 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
24450 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
24460 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
24470 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
24480 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
24490 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
244a0 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
244b0 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
244c0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
244d0 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
244e0 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
244f0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
24500 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
24510 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
24520 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
24530 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
24540 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
24550 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
24560 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
24570 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
24580 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
24590 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
245a0 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
245b0 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
245c0 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
245d0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
245e0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
245f0 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
24600 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
24610 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
24620 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
24630 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
24640 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
24650 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
24660 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
24670 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
24680 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
24690 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
246a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
246b0 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
246c0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
246d0 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
246e0 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
246f0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
24700 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
24710 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
24720 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24730 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  PT;.  }..  pCur-
24740 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
24750 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
24760 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
24770 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
24780 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
24790 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
247a0 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20  idOvfl);..  if( 
247b0 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
247c0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
247d0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
247e0 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
247f0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
24800 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
24810 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
24820 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
24830 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24840 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
24850 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
24860 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
24870 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
24880 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
24890 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
248a0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
248b0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
248c0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
248d0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
248e0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
248f0 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
24900 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
24910 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
24920 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
24930 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
24940 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
24950 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
24960 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
24970 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
24980 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
24990 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
249a0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
249b0 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
249c0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
249d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
249e0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
249f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24a00 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
24a10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24a20 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
24a30 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
24a40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24a50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
24a60 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24a70 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24a80 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
24a90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
24aa0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
24ab0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24ac0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
24ad0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
24ae0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
24af0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
24b00 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
24b10 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
24b20 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
24b30 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
24b40 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
24b50 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
24b60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
24b80 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
24b90 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
24ba0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
24bb0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
24bc0 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
24bd0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
24be0 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
24bf0 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
24c00 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
24c10 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
24c20 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
24c30 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
24c40 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
24c50 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
24c60 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
24c70 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
24c80 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
24c90 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
24ca0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
24cb0 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
24cc0 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
24cd0 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
24ce0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
24cf0 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
24d00 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
24d10 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
24d20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
24d30 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
24d40 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24d50 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
24d60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24d70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24d80 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
24d90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24da0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24db0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24dc0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24dd0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
24de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
24df0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24e00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24e10 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
24e20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
24e30 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
24e40 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
24e50 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
24e60 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24e70 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
24e80 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
24e90 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
24ea0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
24eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24ec0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
24ed0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
24ee0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
24ef0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
24f00 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
24f10 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
24f20 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
24f30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24f40 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
24f50 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
24f60 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
24f70 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
24f80 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
24f90 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
24fa0 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
24fb0 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
24fc0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
24fd0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
24fe0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
24ff0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
25000 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25010 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
25020 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
25030 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
25040 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25050 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
25060 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
25070 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
25080 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
25090 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
250a0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
250b0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
250c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
250d0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
250e0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
250f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25100 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
25110 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
25120 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
25130 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
25140 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
25150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
25160 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
25170 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25180 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
25190 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
251a0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
251b0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
251c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
251d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
251e0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
251f0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
25200 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
25210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
25220 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
25230 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
25240 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
25250 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
25260 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
25270 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
25280 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
25290 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
252a0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
252b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
252c0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
252d0 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
252e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
252f0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
25300 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25310 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
25320 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
25330 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
25340 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
25350 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
25360 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
25370 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
25380 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
25390 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28  Cur->eState && (
253a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
253b0 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
253c0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
253d0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
253e0 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
253f0 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
25400 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
25410 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
25420 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
25430 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
25440 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
25450 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
25460 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
25470 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
25480 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25490 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
254a0 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
254b0 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
254c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
254d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
254e0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
254f0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
25500 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
25510 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
25520 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
25530 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
25540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25550 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
25560 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
25570 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
25580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
25590 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
255a0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
255b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
255c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
255d0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
255e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
255f0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
25600 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
25610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
25620 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
25630 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25640 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
25650 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
25660 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
25670 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Cur);.      if( 
25680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25690 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
256a0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
256b0 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65  AtLast;.      }e
256c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75  lse{.        pCu
256d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
256e0 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
256f0 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20     }.   .    }. 
25700 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25710 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
25720 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
25730 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
25740 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
25750 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
25760 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
25770 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
25780 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
25790 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
257a0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
257b0 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
257c0 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
257d0 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
257e0 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
257f0 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
25800 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
25810 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
25820 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
25830 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
25840 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
25850 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
25860 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25870 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
25880 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
25890 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
258a0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
258b0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
258c0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
258d0 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
258e0 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
258f0 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
25900 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
25910 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
25920 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
25930 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
25940 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
25950 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
25960 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
25970 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
25980 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
25990 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
259a0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
259b0 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
259c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
259d0 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
259e0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
259f0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25a00 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
25a10 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
25a20 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
25a30 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
25a40 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
25a50 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
25a60 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
25a70 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
25a80 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
25a90 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
25aa0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
25ab0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
25ac0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
25ad0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
25b00 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
25b10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
25b20 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
25b30 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
25b40 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
25b50 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
25b60 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
25b70 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
25b80 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
25b90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
25ba0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
25bb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25bd0 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
25be0 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
25bf0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
25c00 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
25c10 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
25c20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
25c30 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
25c40 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
25c50 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
25c60 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
25c70 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
25c80 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
25c90 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25cb0 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
25cc0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
25cd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63  .  int rc;.  Rec
25ce0 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f  ordCompare xReco
25cf0 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73  rdCompare;..  as
25d00 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25d10 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25d20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25d30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
25d40 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
25d50 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
25d60 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
25d70 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
25d80 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
25d90 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
25da0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
25db0 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
25dc0 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
25dd0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
25de0 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
25df0 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
25e00 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
25e10 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
25e20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25e30 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
25e40 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25e50 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
25e60 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  !=0.   && pCur->
25e70 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
25e80 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
25e90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
25ea0 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
25eb0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
25ec0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25ed0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
25ee0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
25ef0 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
25f00 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  !=0 && pCur->inf
25f10 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
25f20 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
25f30 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
25f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
25f50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
25f60 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
25f70 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
25f80 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
25f90 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
25fa0 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
25fb0 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
25fc0 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
25fd0 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
25fe0 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
25ff0 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
26000 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
26010 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
26020 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
26030 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
26040 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
26050 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
26060 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
26070 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
26080 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
26090 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
260a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
260b0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
260c0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
260d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
260e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
260f0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
26100 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26110 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
26120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26130 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26140 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
26150 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26160 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
26170 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
26180 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
26190 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
261a0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
261b0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
261c0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
261d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
261e0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
261f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26200 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
26210 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
26220 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c  ge[0]->intKey ||
26230 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
26240 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
26250 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
26260 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
26270 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
26280 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
26290 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
262a0 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
262d0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
262e0 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
262f0 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
26300 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
26310 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
26320 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
26330 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
26340 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
26350 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
26360 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
26370 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
26380 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
26390 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
263a0 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
263b0 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
263c0 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
263d0 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
263e0 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
263f0 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
26400 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
26410 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
26420 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
26430 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
26440 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
26450 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
26460 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
26470 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
26480 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
26490 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
264a0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
264b0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
264c0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
264d0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
264e0 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
264f0 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
26500 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
26510 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
26520 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
26530 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
26540 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
26550 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
26560 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
26570 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
26580 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
26590 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
265a0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
265b0 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
265c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
265d0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
265e0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
265f0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
26600 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
26610 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20  l(pPage, idx) + 
26620 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
26630 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
26640 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
26650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
26660 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43  le( 0x80 <= *(pC
26670 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  ell++) ){.      
26680 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e        if( pCell>
26690 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
266a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
266b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
266c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
266d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
266e0 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
266f0 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
26700 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
26710 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
26720 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
26730 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
26740 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
26750 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
26760 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
26770 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
26780 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
26790 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
267a0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
267b0 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
267c0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
267d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
267e0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
267f0 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
26800 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
26810 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
26820 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  dNKey;.         
26830 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
26840 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
26850 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
26860 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
26870 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
26880 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
26890 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
268a0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
268b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
268c0 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  o moveto_next_la
268d0 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  yer;.          }
268e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
268f0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
26900 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26910 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
26920 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
26930 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
26940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26950 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
26960 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
26970 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
26980 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
26990 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   = (lwr+upr)/2; 
269a0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
269b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
269c0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ;;){.        int
269d0 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   nCell;.        
269e0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
269f0 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
26a00 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
26a10 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ze;..        /* 
26a20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
26a30 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
26a40 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
26a50 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
26a60 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
26a70 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
26a80 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
26a90 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
26aa0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
26ab0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
26ac0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
26ad0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
26ae0 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
26af0 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
26b00 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
26b10 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
26b20 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
26b30 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
26b40 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
26b50 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
26b60 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
26b70 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
26b80 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
26b90 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
26ba0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
26bb0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
26bc0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
26bd0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
26be0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
26bf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26c00 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
26c10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
26c20 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
26c30 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
26c40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
26c50 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
26c60 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
26c70 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
26c80 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
26c90 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
26ca0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
26cb0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
26cc0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
26cd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
26ce0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
26cf0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26d00 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
26d10 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
26d20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
26d30 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
26d40 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
26d50 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
26d60 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  y, 0);.        }
26d70 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
26d80 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
26d90 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
26da0 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
26db0 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
26dc0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
26dd0 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
26de0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
26df0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
26e00 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
26e10 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
26e20 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
26e30 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
26e40 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
26e50 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
26e60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26e70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
26e80 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
26e90 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
26ea0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
26eb0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
26ec0 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 2c 20  ll[2], pIdxKey, 
26ed0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
26ee0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
26ef0 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
26f00 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
26f10 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
26f20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
26f30 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
26f40 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
26f50 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
26f60 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
26f70 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
26f80 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
26f90 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
26fa0 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
26fb0 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
26fc0 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
26fd0 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
26fe0 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
26ff0 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20  be called. */.  
27000 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
27010 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
27020 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
27030 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
27040 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
27050 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
27060 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
27070 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  r(pPage, pCellBo
27080 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
27090 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
270a0 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
270b0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
270c0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
270d0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
270e0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ell );.         
270f0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
27100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
27120 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
27130 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
27140 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
27150 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
27160 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27170 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
27180 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
27190 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
271a0 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
271b0 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
271c0 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  Key, 2);.       
271d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
271e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
271f0 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
27200 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
27210 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
27220 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27230 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
27240 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
27250 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
27260 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
27270 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27280 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
27290 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
272a0 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
272b0 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
272c0 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
272d0 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
272e0 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
272f0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
27300 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
27310 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
27320 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
27330 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
27340 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
27350 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
27360 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
27370 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
27380 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
27390 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
273a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
273b0 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
273c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
273d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
273e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
273f0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
27400 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
27410 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
27420 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
27430 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
27440 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
27450 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
27460 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
27470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
27480 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
27490 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
274a0 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
274b0 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
274c0 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
274d0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
274e0 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
274f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
27500 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
27510 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
27520 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
27530 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27540 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
27550 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
27560 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
27570 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27580 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
27590 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
275a0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
275b0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
275c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
275d0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
275e0 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
275f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27600 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
27610 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
27620 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
27630 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
27640 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
27650 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
27660 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
27670 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
27680 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
27690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
276a0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
276b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
276c0 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
276d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
276e0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
276f0 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
27700 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
27710 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
27720 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
27730 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
27740 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
27750 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
27760 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
27770 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
27780 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
27790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
277a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
277b0 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
277c0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
277d0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
277e0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
277f0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
27800 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
27810 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
27820 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
27830 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
27840 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
27850 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
27860 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
27870 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
27880 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
27890 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
278a0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
278b0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
278c0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
278d0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
278e0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
278f0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
27900 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
27910 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
27920 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
27930 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
27940 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
27950 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
27960 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
27970 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
27980 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
27990 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
279a0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
279b0 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
279c0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
279d0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
279e0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
279f0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
27a00 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
27a10 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
27a20 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
27a30 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
27a40 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
27a50 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
27a60 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
27a70 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
27a80 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
27a90 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
27aa0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
27ab0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
27ac0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
27ad0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
27ae0 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
27af0 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
27b00 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
27b10 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
27b20 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
27b30 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
27b40 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
27b50 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
27b60 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
27b70 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
27b80 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
27b90 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
27ba0 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
27bb0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
27bc0 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
27bd0 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
27be0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
27bf0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
27c00 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
27c10 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
27c20 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
27c30 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
27c40 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
27c50 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
27c60 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
27c70 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
27c80 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
27c90 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
27ca0 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
27cb0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
27cc0 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
27cd0 77 65 76 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73  wever.).*/.int s
27ce0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
27cf0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27d00 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
27d10 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
27d20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
27d30 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
27d40 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
27d50 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
27d60 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
27d70 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
27d80 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
27d90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
27da0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
27db0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
27dc0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66  OR_VALID );.  if
27dd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
27de0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
27df0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
27e00 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
27e10 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
27e20 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
27e30 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
27e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27e50 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
27e60 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
27e70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
27e80 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
27e90 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
27ea0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
27eb0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
27ec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
27ed0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
27ee0 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
27ef0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
27f00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27f10 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
27f20 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
27f30 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
27f40 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
27f50 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
27f60 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
27f70 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ext>0 ){.       
27f80 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
27f90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  = 0;.        *pR
27fa0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
27fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27fd0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
27fe0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
27ff0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
28000 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28010 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43  e];.  idx = ++pC
28020 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28030 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
28040 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
28050 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
28060 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
28070 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20   corrupt, it is 
28080 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
28090 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20   value of idx . 
280a0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69   ** to be invali
280b0 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e  d here. This can
280c0 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61   only occur if a
280d0 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d   second cursor m
280e0 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65  odifies.  ** the
280f0 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73   page while curs
28100 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69  or pCur is holdi
28110 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
28120 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a  o it. Which can.
28130 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e    ** only happen
28140 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
28150 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73   is corrupt in s
28160 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20  uch a way as to 
28170 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61  link the.  ** pa
28180 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ge into more tha
28190 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
281a0 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73  ucture. */.  tes
281b0 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65  tcase( idx>pPage
281c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43  ->nCell );..  pC
281d0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
281e0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
281f0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
28200 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
28210 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
28220 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
28230 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
28240 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
28250 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
28260 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
28270 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
28280 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
28290 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
282a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
282b0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
282c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
282d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
282e0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
282f0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52  pCur);.      *pR
28300 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
28310 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28320 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
28330 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
28340 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
28350 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
28360 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28370 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
28380 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28390 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
283a0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
283b0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
283c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
283d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
283e0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
283f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28400 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
28410 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65  Cell );.    *pRe
28420 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
28430 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
28440 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28450 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
28460 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
28470 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
28480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
28490 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
284a0 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
284b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
284c0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
284d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
284e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
284f0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
28500 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
28510 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
28520 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
28530 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
28540 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
28550 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
28560 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
28570 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
28580 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
28590 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
285a0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
285b0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
285c0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
285d0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
285e0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
285f0 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54  *pRes=1..**.** T
28600 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
28610 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
28620 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
28630 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
28640 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
28650 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
28660 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
28670 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
28680 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
28690 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
286a0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
286b0 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
286c0 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
286d0 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
286e0 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
286f0 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
28700 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
28710 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
28720 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
28730 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
28740 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
28750 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
28760 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
28770 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
28780 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
28790 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
287a0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
287b0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
287c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
287d0 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
287e0 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
287f0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
28800 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
28810 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
28820 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
28830 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
28840 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
28850 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
28860 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
28870 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
28880 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28890 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
288a0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
288b0 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
288c0 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
288d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
288e0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
288f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
28900 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
28910 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
28920 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
28930 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
28940 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
28950 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
28960 49 44 20 29 7b 0a 20 20 20 20 69 66 28 20 41 4c  ID ){.    if( AL
28970 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74  WAYS(pCur->eStat
28980 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
28990 45 53 45 45 4b 29 20 29 7b 0a 20 20 20 20 20 20  ESEEK) ){.      
289a0 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72  rc = btreeRestor
289b0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
289c0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28  pCur);.      if(
289d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
289e0 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
289f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
28a00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28a10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
28a20 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
28a30 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
28a40 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
28a50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28a60 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
28a70 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
28a80 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
28a90 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28aa0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28ab0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
28ac0 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
28ad0 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
28ae0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
28af0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
28b00 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c   pCur->skipNext<
28b10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
28b20 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
28b30 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
28b40 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
28b50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28b60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
28b70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
28b80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
28b90 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
28ba0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
28bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28bc0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
28bd0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
28be0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
28bf0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28c00 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
28c10 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
28c20 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
28c30 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
28c40 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
28c50 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
28c60 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
28c70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
28c80 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
28c90 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
28ca0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
28cb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28cc0 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
28cd0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
28ce0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
28cf0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
28d00 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
28d10 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
28d20 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
28d30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28d40 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
28d50 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
28d60 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
28d70 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
28d80 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
28d90 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
28da0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
28db0 64 4f 76 66 6c 29 3b 0a 0a 20 20 20 20 70 43 75  dOvfl);..    pCu
28dc0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28dd0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
28de0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
28df0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
28e00 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
28e10 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
28e20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
28e30 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
28e40 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
28e50 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
28e60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
28e70 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
28e80 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
28e90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28ea0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
28eb0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
28ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28ed0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
28ee0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
28ef0 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
28f00 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
28f10 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
28f20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
28f30 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
28f40 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
28f50 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
28f60 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
28f70 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
28f80 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
28f90 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
28fa0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
28fb0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
28fc0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
28fd0 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
28fe0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
28ff0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
29000 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
29010 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
29020 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
29030 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
29040 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
29050 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
29060 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
29070 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
29080 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
29090 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
290a0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
290b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
290c0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
290d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
290e0 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
290f0 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
29100 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
29110 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
29120 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
29130 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
29140 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
29150 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
29160 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
29170 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
29180 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
29190 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
291a0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
291b0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
291c0 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
291d0 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
291e0 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
291f0 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
29200 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
29210 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
29220 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
29230 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
29240 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
29250 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
29260 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
29270 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
29280 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
29290 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
292a0 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
292b0 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
292c0 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
292d0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
292e0 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
292f0 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
29300 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
29310 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
29320 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
29330 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
29340 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
29350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29360 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
29370 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
29380 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
29390 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
293a0 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
293b0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
293c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
293d0 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
293e0 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
293f0 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
29400 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
29410 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
29420 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
29430 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
29440 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
29450 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
29460 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
29470 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
29480 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
29490 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
294a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
294b0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
294c0 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
294d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
294e0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
294f0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
29500 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
29510 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
29520 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
29530 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
29540 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
29550 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
29560 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
29570 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
29580 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
29590 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
295a0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
295b0 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
295c0 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
295d0 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
295e0 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
295f0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
29600 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
29610 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
29620 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
29630 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
29640 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
29650 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
29660 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
29670 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
29680 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
29690 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
296a0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
296b0 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
296c0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
296d0 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
296e0 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
296f0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
29700 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
29710 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
29720 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
29730 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
29740 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
29750 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
29760 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
29770 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
29780 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
29790 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
297a0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
297b0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
297c0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
297d0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
297e0 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
297f0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
29800 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
29810 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
29820 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
29830 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
29840 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
29850 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
29860 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
29870 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
29880 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29890 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
298a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
298b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
298c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
298d0 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
298e0 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
298f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
29900 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29910 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
29920 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
29930 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
29940 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
29950 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29960 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
29970 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
29980 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
29990 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
299a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
299b0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
299c0 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
299d0 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
299e0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
299f0 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
29a00 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
29a10 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
29a20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
29a30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
29a40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29a50 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
29a60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
29a70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
29a80 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
29a90 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
29aa0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
29ab0 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
29ac0 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
29ad0 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
29ae0 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
29af0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
29b00 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
29b10 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
29b20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
29b30 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
29b40 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
29b50 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
29b60 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
29b70 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
29b80 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
29b90 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
29ba0 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
29bb0 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
29bc0 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
29bd0 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
29be0 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
29bf0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
29c00 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
29c10 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
29c20 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
29c30 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
29c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29c50 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
29c60 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
29c70 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
29c80 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
29c90 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
29ca0 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
29cb0 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
29cc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
29cd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29ce0 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
29cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
29d00 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
29d10 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
29d20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
29d30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
29d40 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
29d50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
29d60 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
29d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
29d80 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
29d90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29da0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
29db0 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20  0 );..      k = 
29dc0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
29dd0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20  ->aData[4]); /* 
29de0 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  # of leaves on t
29df0 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  his trunk page *
29e00 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  /.      if( k==0
29e10 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
29e20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
29e30 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
29e40 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
29e50 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
29e60 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
29e70 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
29e80 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
29e90 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
29ea0 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
29eb0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
29ec0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
29ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
29ee0 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
29ef0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29f00 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
29f10 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
29f20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
29f30 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
29f40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
29f50 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
29f60 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
29f70 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
29f80 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
29f90 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
29fa0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
29fb0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
29fc0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
29fd0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
29fe0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
29ff0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2a000 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2a010 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2a020 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
2a030 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
2a040 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2a050 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
2a060 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
2a070 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
2a080 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
2a090 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
2a0a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2a0b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2a0c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2a0d0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
2a0e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a0f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2a100 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
2a110 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
2a120 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
2a130 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
2a140 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
2a150 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
2a160 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2a170 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
2a180 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
2a190 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
2a1a0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
2a1b0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
2a1c0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
2a1d0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
2a1e0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
2a1f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
2a200 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
2a210 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2a220 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2a230 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
2a240 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2a250 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2a260 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2a270 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a280 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2a290 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2a2a0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2a2b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
2a2c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2a2d0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
2a2e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2a2f0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2a300 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2a310 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2a320 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2a330 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2a340 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a350 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2a360 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2a370 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a390 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2a3a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2a3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a3c0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2a3d0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
2a3e0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2a3f0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2a400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a420 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2a430 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
2a440 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2a450 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
2a460 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2a470 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
2a480 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
2a490 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
2a4a0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
2a4b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
2a4c0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
2a4d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2a4e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2a4f0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
2a500 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
2a510 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2a520 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
2a530 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
2a540 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
2a550 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
2a560 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2a570 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2a580 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2a590 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2a5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a5b0 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
2a5c0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
2a5d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a5e0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2a5f0 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
2a600 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
2a610 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a630 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2a640 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a650 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a660 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a670 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2a680 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
2a690 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a6a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
2a6c0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2a6d0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
2a6e0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2a6f0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2a700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
2a710 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2a720 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2a730 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2a740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
2a750 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
2a760 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
2a770 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
2a780 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2a790 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
2a7a0 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
2a7b0 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
2a7c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2a7d0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2a7e0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2a7f0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2a800 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a810 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2a820 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2a830 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2a840 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2a850 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2a860 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2a870 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a880 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a890 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a8a0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
2a8b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2a8c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2a8d0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2a8e0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2a8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a900 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2a910 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
2a920 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
2a930 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2a940 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2a950 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2a960 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2a970 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2a980 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2a990 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2a9a0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
2a9b0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
2a9c0 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
2a9d0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
2a9e0 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
2a9f0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
2aa00 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
2aa10 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
2aa20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2aa30 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
2aa40 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
2aa50 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
2aa60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
2aa70 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
2aa80 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
2aa90 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
2aaa0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2aac0 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
2aae0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2aaf0 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
2ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2ab10 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
2ab20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ab30 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2ab50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2ab60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ab70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
2ab80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2ab90 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
2aba0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
2abb0 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
2abc0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
2abd0 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
2abe0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
2abf0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2ac00 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
2ac10 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
2ac20 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
2ac30 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
2ac40 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
2ac50 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
2ac60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ac70 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
2ac80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ac90 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
2aca0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2acb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2acc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2acd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2ace0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2acf0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
2ad00 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2ad10 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
2ad20 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
2ad30 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
2ad40 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2ad50 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
2ad60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
2ad70 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2ad80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2ad90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2ada0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2adb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
2adc0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2add0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2ade0 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
2adf0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
2ae00 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
2ae10 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
2ae20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2ae30 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
2ae40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
2ae50 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
2ae60 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
2ae70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
2ae80 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2ae90 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
2aea0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
2aeb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2aec0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
2aed0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
2aef0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
2af00 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
2af10 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
2af20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2af30 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2af40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2af50 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2af60 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2af70 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2af80 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
2af90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
2afa0 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
2afb0 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
2afc0 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
2afd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2afe0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
2aff0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
2b000 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
2b010 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
2b020 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
2b030 67 6e 6f 29 20 3f 20 50 41 47 45 52 5f 47 45 54  gno) ? PAGER_GET
2b040 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a  _NOCONTENT : 0;.
2b050 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2b060 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2b070 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
2b080 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
2b090 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2b0a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b0b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b0c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
2b0d0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2b0e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2b0f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b100 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2b110 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2b120 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
2b130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b140 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
2b150 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
2b160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2b170 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2b180 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
2b190 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2b1a0 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
2b1b0 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
2b1c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2b1d0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
2b1e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2b1f0 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
2b200 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
2b210 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
2b220 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
2b230 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
2b240 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
2b250 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
2b260 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
2b270 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
2b280 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
2b290 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
2b2a0 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
2b2b0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
2b2c0 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
2b2d0 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
2b2e0 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
2b2f0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
2b300 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
2b310 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
2b320 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
2b330 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
2b340 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
2b350 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
2b360 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
2b370 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
2b380 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
2b390 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
2b3a0 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
2b3b0 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
2b3c0 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
2b3d0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
2b3e0 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
2b3f0 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
2b400 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
2b410 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
2b420 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
2b430 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
2b440 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
2b450 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
2b460 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
2b470 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2b480 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
2b490 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
2b4a0 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
2b4b0 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
2b4c0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
2b4d0 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
2b4e0 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
2b4f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
2b500 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
2b510 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
2b520 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
2b530 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
2b540 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
2b550 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
2b560 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
2b570 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
2b580 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
2b590 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
2b5a0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2b5b0 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
2b5c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b5d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2b5e0 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
2b5f0 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
2b600 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
2b610 29 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  )) ? PAGER_GET_N
2b620 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a 20  OCONTENT : 0;.. 
2b630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b640 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
2b650 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2b660 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2b670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
2b680 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
2b690 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
2b6a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2b6b0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
2b6c0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
2b6d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2b6e0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
2b6f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2b700 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2b710 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
2b720 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
2b730 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
2b740 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
2b750 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
2b760 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
2b770 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
2b780 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
2b790 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
2b7a0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
2b7b0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
2b7c0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
2b7d0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
2b7e0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
2b7f0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
2b800 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
2b810 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
2b820 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2b830 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
2b840 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
2b850 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
2b860 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
2b870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b880 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
2b890 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2b8a0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
2b8b0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2b8c0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
2b8d0 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  Pg, bNoContent);
2b8e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2b8f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b910 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
2b920 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2b930 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2b940 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2b950 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2b960 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
2b970 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
2b980 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
2b990 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2b9a0 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
2b9b0 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
2b9c0 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
2b9d0 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
2b9e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
2b9f0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
2ba00 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
2ba10 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
2ba20 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
2ba30 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2ba40 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
2ba50 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2ba60 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
2ba70 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
2ba80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2ba90 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
2baa0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2bab0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
2bac0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2bad0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bae0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2baf0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2bb00 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
2bb10 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
2bb20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
2bb30 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
2bb40 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
2bb50 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2bb60 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
2bb70 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
2bb80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
2bb90 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
2bba0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
2bbb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2bbc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2bbd0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2bbe0 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
2bbf0 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
2bc00 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2bc10 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
2bc20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
2bc30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2bc40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2bc50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
2bc60 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
2bc70 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2bc80 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
2bc90 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
2bca0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
2bcb0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2bcc0 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  able((*ppPage)->
2bcd0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
2bce0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2bcf0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2bd00 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
2bd10 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
2bd20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
2bd30 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
2bd40 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
2bd50 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2bd60 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
2bd70 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
2bd80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
2bd90 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2bda0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2bdb0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2bdc0 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
2bdd0 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
2bde0 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
2bdf0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2be00 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
2be10 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
2be20 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
2be30 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
2be40 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
2be50 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
2be60 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
2be70 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
2be80 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
2be90 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
2bea0 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
2beb0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2bec0 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
2bed0 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
2bee0 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
2bef0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
2bf00 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
2bf10 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
2bf20 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
2bf30 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
2bf40 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
2bf50 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
2bf60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
2bf70 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2bf80 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
2bf90 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
2bfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2bfb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
2bfc0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2bfd0 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
2bfe0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
2bff0 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
2c000 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
2c010 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
2c020 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c040 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
2c050 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
2c060 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
2c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c090 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2c0a0 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
2c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0c0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
2c0d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2c0e0 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
2c0f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c100 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2c110 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2c120 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b  sert( iPage>1 );
2c130 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
2c140 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
2c150 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
2c160 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ..  if( pMemPage
2c170 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
2c180 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
2c190 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
2c1a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2c1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
2c1c0 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
2c1d0 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
2c1e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
2c1f0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
2c200 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
2c210 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
2c220 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2c230 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2c240 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2c250 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2c260 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
2c270 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2c280 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
2c290 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2c2a0 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
2c2b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
2c2c0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
2c2d0 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
2c2e0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65  /* If the secure
2c2f0 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69  _delete option i
2c300 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
2c310 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75      ** always fu
2c320 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
2c330 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
2c340 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
2c350 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
2c360 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62  Page && ((rc = b
2c370 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2c380 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
2c390 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c  0))!=0) ).     |
2c3a0 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72  |            ((r
2c3b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c3c0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2c3d0 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29  Page))!=0).    )
2c3e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
2c3f0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2c400 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
2c410 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
2c420 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
2c430 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
2c440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
2c450 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
2c460 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
2c470 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
2c480 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
2c490 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2c4a0 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
2c4b0 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
2c4c0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72  ACUUM ){.    ptr
2c4d0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
2c4e0 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
2c4f0 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
2c500 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
2c510 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
2c520 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
2c530 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
2c540 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
2c550 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
2c560 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
2c570 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
2c580 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
2c590 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
2c5a0 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
2c5b0 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
2c5c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
2c5d0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
2c5e0 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
2c5f0 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
2c600 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
2c610 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
2c620 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
2c630 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
2c640 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
2c650 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2c660 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
2c670 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
2c680 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
2c690 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
2c6a0 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
2c6b0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
2c6c0 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
2c6d0 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
2c6e0 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
2c6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
2c700 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
2c710 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
2c720 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
2c730 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
2c740 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2c750 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
2c760 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2c770 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
2c780 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
2c790 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c7a0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2c7b0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
2c7c0 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
2c7d0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2c7e0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73  ata[4]);.    ass
2c7f0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
2c800 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69  Size>32 );.    i
2c810 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29  f( nLeaf > (u32)
2c820 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2c830 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
2c840 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2c850 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
2c860 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2c870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c880 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74  nLeaf < (u32)pBt
2c890 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2c8a0 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
2c8b0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
2c8c0 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
2c8d0 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
2c8e0 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
2c8f0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
2c900 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
2c910 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
2c920 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2c930 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
2c940 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
2c950 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
2c960 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
2c970 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
2c980 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
2c990 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
2c9a0 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
2c9b0 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
2c9c0 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
2c9d0 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
2c9e0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
2c9f0 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
2ca00 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
2ca10 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
2ca20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
2ca30 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
2ca40 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
2ca50 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2ca60 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
2ca70 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
2ca80 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
2ca90 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
2caa0 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
2cab0 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
2cac0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2cad0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
2cae0 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
2caf0 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
2cb00 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
2cb10 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
2cb20 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
2cb30 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
2cb40 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
2cb50 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
2cb60 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
2cb70 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
2cb80 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
2cb90 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
2cba0 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
2cbb0 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
2cbc0 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
2cbd0 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
2cbe0 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
2cbf0 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
2cc00 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2cc10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2cc20 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2cc30 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2cc40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cc50 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
2cc60 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
2cc70 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
2cc80 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
2cc90 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
2cca0 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
2ccb0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
2ccc0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2ccd0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
2cce0 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
2ccf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2cd00 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
2cd10 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2cd20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cd30 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
2cd40 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
2cd50 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
2cd60 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
2cd70 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
2cd80 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
2cd90 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
2cda0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
2cdb0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2cdc0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
2cdd0 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
2cde0 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
2cdf0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
2ce00 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
2ce10 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
2ce20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
2ce30 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
2ce40 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
2ce50 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
2ce60 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
2ce70 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
2ce80 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
2ce90 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
2cea0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
2ceb0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
2cec0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
2ced0 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
2cee0 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
2cef0 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
2cf00 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2cf10 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
2cf20 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
2cf30 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
2cf40 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
2cf50 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2cf60 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2cf70 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
2cf80 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
2cf90 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2cfa0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
2cfb0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2cfc0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
2cfd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cfe0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
2cff0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2d000 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
2d010 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
2d020 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
2d030 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
2d040 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2d050 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2d060 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
2d070 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
2d080 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
2d090 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
2d0a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
2d0b0 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
2d0c0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
2d0d0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
2d0e0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
2d0f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2d100 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
2d110 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
2d120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
2d130 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
2d140 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
2d150 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
2d160 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
2d170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
2d180 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
2d190 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
2d1a0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
2d1b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
2d1c0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2d1d0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2d1e0 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
2d1f0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2d200 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
2d210 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
2d220 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
2d230 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2d240 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2d250 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2d260 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
2d270 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2d280 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
2d290 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
2d2a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2d2b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2d2c0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2d2d0 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
2d2e0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2d2f0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
2d300 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
2d310 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2d320 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
2d330 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
2d340 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
2d350 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
2d360 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
2d370 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
2d380 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44  ow+3 > pPage->aD
2d390 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
2d3a0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
2d3b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2d3c0 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  _BKPT;  /* Cell 
2d3d0 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
2d3e0 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
2d3f0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
2d400 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
2d410 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
2d420 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
2d430 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
2d440 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
2d450 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2d460 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
2d470 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
2d480 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
2d490 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
2d4a0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
2d4b0 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e   assert( ovflPgn
2d4c0 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20  o==0 || nOvfl>0 
2d4d0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
2d4e0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
2d4f0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
2d500 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
2d510 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
2d520 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
2d530 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
2d540 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
2d550 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
2d560 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
2d570 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
2d580 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
2d590 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2d5a0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
2d5b0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
2d5c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
2d5d0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
2d5e0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
2d5f0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
2d600 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d610 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2d620 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2d630 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
2d640 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
2d650 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
2d660 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
2d670 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2d680 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2d690 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
2d6a0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
2d6b0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2d6c0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
2d6d0 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
2d6e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
2d6f0 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
2d700 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
2d710 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
2d720 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
2d730 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
2d740 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
2d750 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
2d760 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
2d770 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
2d780 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
2d790 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
2d7a0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
2d7b0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
2d7c0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
2d7d0 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
2d7e0 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
2d7f0 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
2d800 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
2d810 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
2d820 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
2d830 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2d840 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
2d850 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
2d860 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
2d870 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
2d880 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
2d890 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
2d8a0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
2d8b0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
2d8c0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
2d8d0 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
2d8e0 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
2d8f0 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
2d900 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
2d910 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
2d920 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
2d930 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
2d940 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
2d950 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
2d960 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
2d970 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
2d980 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
2d990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2d9a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2d9b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2d9c0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
2d9d0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
2d9e0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
2d9f0 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
2da00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2da10 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
2da20 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2da30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2da40 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
2da50 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
2da60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2da70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2da80 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
2da90 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
2daa0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
2dab0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
2dac0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
2dad0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
2dae0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
2daf0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
2db00 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
2db10 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
2db20 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
2db30 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
2db40 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2db50 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
2db60 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
2db70 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
2db80 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
2db90 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2dba0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
2dbb0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
2dbc0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2dbd0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
2dbe0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
2dbf0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
2dc00 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
2dc10 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
2dc20 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
2dc30 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
2dc40 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
2dc50 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
2dc60 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
2dc70 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2dc80 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
2dc90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dcb0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
2dcc0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
2dcd0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
2dce0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
2dcf0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
2dd00 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
2dd10 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
2dd20 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
2dd30 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
2dd40 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
2dd50 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
2dd60 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
2dd70 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
2dd80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2dd90 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
2dda0 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
2ddb0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
2ddc0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dde0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
2ddf0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
2de00 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
2de10 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
2de20 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
2de30 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
2de40 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
2de50 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
2de60 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
2de70 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
2de80 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
2de90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2dea0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
2deb0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2dec0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
2ded0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
2dee0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
2def0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
2df00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2df10 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2df20 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2df30 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
2df40 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
2df50 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
2df60 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
2df70 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
2df80 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
2df90 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
2dfa0 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
2dfb0 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
2dfc0 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
2dfd0 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
2dfe0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2dff0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2e000 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2e010 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e020 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2e030 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
2e040 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
2e050 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
2e060 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
2e070 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
2e080 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
2e090 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
2e0a0 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
2e0b0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
2e0c0 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
2e0d0 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  r], nData+nZero)
2e0e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
2e0f0 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30  Data = nZero = 0
2e100 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
2e110 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
2e120 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
2e130 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62  u64*)&nKey);.  b
2e140 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2e150 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
2e160 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
2e170 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
2e180 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
2e190 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
2e1a0 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2e1b0 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33   info.nData==(u3
2e1c0 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20  2)(nData+nZero) 
2e1d0 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
2e1e0 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
2e1f0 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
2e200 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
2e210 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2e220 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
2e230 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
2e240 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
2e250 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
2e260 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28   .    if( NEVER(
2e270 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  nKey>0x7fffffff 
2e280 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20  || pKey==0) ){. 
2e290 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e2a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2e2b0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
2e2c0 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79  oad += (int)nKey
2e2d0 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
2e2e0 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69  y;.    nSrc = (i
2e2f0 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a  nt)nKey;.  }.  *
2e300 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53  pnSize = info.nS
2e310 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74  ize;.  spaceLeft
2e320 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a   = info.nLocal;.
2e330 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
2e340 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
2e350 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
2e360 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b  info.iOverflow];
2e370 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  ..  while( nPayl
2e380 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
2e390 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
2e3a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e3b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2e3c0 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
2e3d0 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
2e3e0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
2e3f0 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
2e400 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
2e410 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2e420 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
2e430 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
2e440 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
2e450 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
2e460 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
2e470 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
2e480 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
2e490 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2e4a0 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
2e4b0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
2e4c0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
2e4d0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2e4e0 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
2e4f0 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
2e500 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
2e510 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2e520 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
2e530 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
2e540 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
2e550 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
2e560 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
2e570 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
2e580 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
2e590 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
2e5a0 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
2e5b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
2e5c0 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
2e5d0 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
2e5e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
2e5f0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
2e600 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
2e610 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
2e620 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
2e630 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
2e640 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
2e650 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
2e660 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
2e670 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
2e680 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
2e690 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
2e6a0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
2e6b0 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
2e6c0 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
2e6d0 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
2e6e0 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  tialized values 
2e6f0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
2e700 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
2e710 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
2e720 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
2e730 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
2e740 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
2e750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e760 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
2e770 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
2e780 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
2e790 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
2e7a0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
2e7b0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
2e7c0 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
2e7d0 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
2e7e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e7f0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2e800 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
2e810 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
2e820 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
2e830 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2e840 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
2e850 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
2e860 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2e870 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
2e880 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
2e890 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
2e8a0 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
2e8b0 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
2e8c0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
2e8d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
2e8e0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
2e8f0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
2e900 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
2e910 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2e920 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2e930 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2e940 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2e950 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
2e960 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
2e970 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2e980 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2e990 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
2e9a0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
2e9b0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
2e9c0 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
2e9d0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
2e9e0 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
2e9f0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2ea00 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2ea10 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2ea20 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2ea30 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2ea40 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
2ea50 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
2ea60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ea70 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2ea80 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
2ea90 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
2eaa0 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
2eab0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
2eac0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
2ead0 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
2eae0 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
2eaf0 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
2eb00 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
2eb10 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
2eb20 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
2eb30 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
2eb40 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
2eb50 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
2eb60 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
2eb70 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
2eb80 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
2eb90 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
2eba0 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
2ebb0 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
2ebc0 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
2ebd0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2ebe0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2ebf0 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
2ec00 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2ec10 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
2ec20 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
2ec30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
2ec40 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
2ec50 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
2ec60 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
2ec70 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
2ec80 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
2ec90 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
2eca0 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
2ecb0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
2ecc0 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
2ecd0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2ece0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2ecf0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2ed00 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2ed10 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2ed20 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ..    if( nSrc>0
2ed30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
2ed40 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
2ed50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ed60 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
2ed70 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
2ed80 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
2ed90 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
2eda0 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
2edb0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
2edc0 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
2edd0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
2ede0 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
2edf0 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
2ee00 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
2ee10 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
2ee20 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
2ee30 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
2ee40 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
2ee50 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2ee60 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2ee70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ee80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
2ee90 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
2eea0 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
2eeb0 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
2eec0 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
2eed0 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
2eee0 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
2eef0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
2ef00 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
2ef10 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
2ef20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
2ef30 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
2ef40 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
2ef50 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
2ef60 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
2ef70 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
2ef80 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
2ef90 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
2efa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2efb0 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
2efc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
2efd0 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
2efe0 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
2eff0 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52   int sz, int *pR
2f000 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20  C){.  u32 pc;   
2f010 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2f020 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
2f030 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
2f040 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
2f050 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
2f060 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
2f070 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
2f080 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
2f090 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
2f0a0 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
2f0b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2f0c0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
2f0d0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
2f0e0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
2f0f0 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
2f100 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
2f110 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
2f120 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
2f130 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
2f140 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
2f150 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2f160 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
2f170 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
2f180 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
2f190 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2f1a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2f1b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
2f1c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f1d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2f1e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2f1f0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2f200 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
2f210 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
2f220 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
2f230 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
2f240 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2f250 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
2f260 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
2f270 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
2f280 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
2f290 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
2f2a0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2f2b0 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
2f2c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2f2d0 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
2f2e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2f2f0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
2f300 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
2f310 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
2f320 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
2f330 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
2f340 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
2f350 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
2f360 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
2f370 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
2f380 43 65 6c 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76  Cell--;.  memmov
2f390 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
2f3a0 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
2f3b0 69 64 78 29 29 3b 0a 20 20 70 75 74 32 62 79 74  idx));.  put2byt
2f3c0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
2f3d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
2f3e0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
2f3f0 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   2;.}../*.** Ins
2f400 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
2f410 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
2f420 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
2f430 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
2f440 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
2f450 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
2f460 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2f470 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
2f480 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
2f490 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
2f4a0 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
2f4b0 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
2f4c0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
2f4d0 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
2f4e0 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
2f4f0 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
2f500 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
2f510 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
2f520 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
2f530 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64  ge->apOvfl[] and
2f540 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
2f550 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
2f560 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
2f570 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
2f580 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
2f590 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
2f5a0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
2f5b0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
2f5c0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
2f5d0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
2f5e0 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
2f5f0 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
2f600 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
2f610 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
2f620 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
2f630 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
2f640 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
2f650 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
2f660 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
2f670 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
2f680 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2f690 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
2f6a0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2f6b0 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
2f6c0 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
2f6d0 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
2f6e0 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
2f6f0 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
2f700 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
2f710 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
2f720 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
2f730 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2f740 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
2f750 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
2f760 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
2f770 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
2f780 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
2f790 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
2f7a0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
2f7b0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
2f7c0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
2f7d0 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
2f7e0 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
2f7f0 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
2f800 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
2f810 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
2f820 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
2f830 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
2f840 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
2f850 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
2f860 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
2f870 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
2f880 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
2f890 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
2f8a0 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
2f8b0 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
2f8c0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
2f8d0 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
2f8e0 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
2f8f0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
2f900 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
2f910 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
2f920 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
2f930 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2f940 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65  unter */.  int e
2f950 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
2f960 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
2f970 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
2f980 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
2f990 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
2f9a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2f9b0 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
2f9c0 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
2f9d0 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
2f9e0 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
2f9f0 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
2fa00 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
2fa10 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
2fa20 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2fa30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
2fa40 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
2fa50 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
2fa60 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20  nSkip = (iChild 
2fa70 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28  ? 4 : 0);..  if(
2fa80 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2fa90 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
2faa0 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
2fab0 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
2fac0 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
2fad0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
2fae0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2faf0 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
2fb00 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
2fb10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2fb20 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
2fb30 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
2fb40 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >apOvfl) );.  as
2fb50 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
2fb60 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d  pPage->apOvfl)==
2fb70 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
2fb80 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >aiOvfl) );.  as
2fb90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2fba0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2fbb0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2fbc0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f   /* The cell sho
2fbd0 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
2fbe0 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  sized correctly.
2fbf0 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20    However, when 
2fc00 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61  moving a.  ** ma
2fc10 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f  lformed cell fro
2fc20 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f  m a leaf page to
2fc30 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   an interior pag
2fc40 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73  e, if the cell s
2fc50 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20  ize.  ** wanted 
2fc60 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
2fc70 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65  4 but got rounde
2fc80 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65  d up to 4 on the
2fc90 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65   leaf, then size
2fca0 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c  .  ** might be l
2fcb0 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66  ess than 8 (leaf
2fcc0 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29  -size + pointer)
2fcd0 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72   on the interior
2fce0 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20   node.  Hence.  
2fcf0 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65  ** the term afte
2fd00 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20  r the || in the 
2fd10 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
2fd20 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
2fd30 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
2fd40 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c  (pPage, pCell) |
2fd50 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69  | (sz==8 && iChi
2fd60 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70  ld>0) );.  if( p
2fd70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2fd80 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
2fd90 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
2fda0 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
2fdb0 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69  emcpy(pTemp+nSki
2fdc0 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  p, pCell+nSkip, 
2fdd0 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20  sz-nSkip);.     
2fde0 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
2fdf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
2fe00 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
2fe10 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
2fe20 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
2fe30 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
2fe40 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
2fe50 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
2fe60 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
2fe70 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
2fe80 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a  >apOvfl[0])) );.
2fe90 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66      pPage->apOvf
2fea0 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  l[j] = pCell;.  
2feb0 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b    pPage->aiOvfl[
2fec0 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d  j] = (u16)i;.  }
2fed0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
2fee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2fef0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2ff00 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2ff10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ff20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
2ff30 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2ff40 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2ff50 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2ff60 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2ff70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
2ff80 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2ff90 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ta;.    cellOffs
2ffa0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
2ffb0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
2ffc0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2ffd0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
2ffe0 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66     ins = cellOff
2fff0 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72  set + 2*i;.    r
30000 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  c = allocateSpac
30010 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64  e(pPage, sz, &id
30020 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  x);.    if( rc )
30030 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74  { *pRC = rc; ret
30040 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68  urn; }.    /* Th
30050 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  e allocateSpace(
30060 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e  ) routine guaran
30070 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  tees the followi
30080 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65  ng two propertie
30090 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72  s.    ** if it r
300a0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a  eturns success *
300b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
300c0 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20  x >= end+2 );.  
300d0 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a    assert( idx+sz
300e0 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
300f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
30100 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
30110 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
30120 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
30130 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
30140 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
30150 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
30160 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
30170 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
30180 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
30190 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
301a0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ld);.    }.    m
301b0 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73  emmove(&data[ins
301c0 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c  +2], &data[ins],
301d0 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70   end-ins);.    p
301e0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
301f0 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
30200 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
30210 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
30220 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
30230 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30240 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
30250 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
30260 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
30270 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
30280 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
30290 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
302a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
302b0 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
302c0 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
302d0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
302e0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
302f0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
30300 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
30310 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
30320 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
30330 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
30340 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
30350 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
30360 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
30370 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
30380 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
30390 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
303a0 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
303b0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
303c0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
303d0 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
303e0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
303f0 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
30400 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
30410 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
30420 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
30430 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
30440 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
30450 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
30460 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
30470 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
30480 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20  /.  u16 *aSize  
30490 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
304a0 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
304b0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
304c0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
304d0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  unter */.  u8 *p
304e0 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20  Cellptr;     /* 
304f0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
30500 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
30510 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
30520 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
30530 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
30540 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
30550 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
30560 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
30570 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
30580 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a  data for pPage *
30590 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  /.  const int hd
305a0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
305b0 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
305c0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
305d0 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a  der on pPage */.
305e0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61    const int nUsa
305f0 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ble = pPage->pBt
30600 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a  ->usableSize; /*
30610 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
30620 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
30630 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
30640 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
30650 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
30660 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
30670 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
30680 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20  ssert( nCell>=0 
30690 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d  && nCell<=(int)M
306a0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
306b0 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t).            &
306c0 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70  & (int)MX_CELL(p
306d0 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
306e0 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  1);.  assert( sq
306f0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30700 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
30710 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  Page) );..  /* C
30720 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
30730 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ge has just been
30740 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50   zeroed by zeroP
30750 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72  age() */.  asser
30760 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
30770 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
30780 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
30790 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e  &data[hdr+5])==n
307a0 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65  Usable );..  pCe
307b0 6c 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e  llptr = &pPage->
307c0 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32  aCellIdx[nCell*2
307d0 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20  ];.  cellbody = 
307e0 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69  nUsable;.  for(i
307f0 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20  =nCell-1; i>=0; 
30800 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  i--){.    u16 sz
30810 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20   = aSize[i];.   
30820 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a   pCellptr -= 2;.
30830 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20      cellbody -= 
30840 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  sz;.    put2byte
30850 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62  (pCellptr, cellb
30860 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ody);.    memcpy
30870 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
30880 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29  , apCell[i], sz)
30890 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
308a0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
308b0 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
308c0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
308d0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
308e0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43  ge->nFree -= (nC
308f0 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20  ell*2 + nUsable 
30900 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  - cellbody);.  p
30910 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75  Page->nCell = (u
30920 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  16)nCell;.}../*.
30930 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
30940 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
30950 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
30960 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
30970 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
30980 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
30990 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
309a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
309b0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
309c0 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
309d0 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
309e0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
309f0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
30a00 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
30a10 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
30a20 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
30a30 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
30a40 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
30a50 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
30a60 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
30a70 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
30a80 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
30a90 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
30aa0 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
30ab0 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
30ac0 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
30ad0 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
30ae0 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
30af0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
30b00 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
30b10 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
30b20 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
30b30 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
30b40 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
30b50 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
30b60 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
30b70 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
30b80 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
30b90 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
30ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30bb0 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
30bc0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
30bd0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
30be0 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
30bf0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
30c00 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
30c10 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
30c20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30c30 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
30c40 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
30c50 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
30c60 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
30c70 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
30c80 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
30c90 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
30ca0 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
30cb0 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
30cc0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
30cd0 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
30ce0 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
30cf0 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
30d00 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
30d10 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
30d20 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
30d30 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62  d of trying to b
30d40 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
30d50 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
30d60 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
30d70 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
30d80 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
30d90 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
30da0 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
30db0 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
30dc0 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
30dd0 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
30de0 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
30df0 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
30e00 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
30e10 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
30e20 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
30e30 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
30e40 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
30e50 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
30e60 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
30e70 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
30e80 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
30e90 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
30ea0 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
30eb0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
30ec0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
30ed0 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
30ee0 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
30ef0 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
30f00 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
30f10 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
30f20 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
30f30 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
30f40 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
30f50 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
30f60 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  er is used to st
30f70 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ore a temporary 
30f80 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69  copy of the divi
30f90 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74  der.** cell that
30fa0 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
30fb0 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  d into pParent. 
30fc0 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73  Such a cell cons
30fd0 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62  ists of a 4.** b
30fe0 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
30ff0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61  followed by a va
31000 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
31010 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a  teger. In other.
31020 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73  ** words, at mos
31030 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63  t 13 bytes. Henc
31040 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
31050 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a  fer must be at.*
31060 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73  * least 13 bytes
31070 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
31080 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
31090 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
310a0 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20  Parent, MemPage 
310b0 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61  *pPage, u8 *pSpa
310c0 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ce){.  BtShared 
310d0 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61  *const pBt = pPa
310e0 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42  ge->pBt;    /* B
310f0 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a  -Tree Database *
31100 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  /.  MemPage *pNe
31110 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
31120 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
31130 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
31140 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
31150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
31170 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
31180 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20  gno pgnoNew;    
31190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311a0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
311b0 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20  er of pNew */.. 
311c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
311d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
311e0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
311f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
31200 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
31210 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
31220 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
31230 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
31240 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  low==1 );..  /* 
31250 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69  This error condi
31260 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67  tion is now caug
31270 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
31280 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  hing this functi
31290 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  on */.  if( pPag
312a0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65  e->nCell==0 ) re
312b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
312c0 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
312d0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
312e0 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77  age. This page w
312f0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
31300 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
31310 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b  .  ** pPage. Mak
31320 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
31330 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74  e writable, so t
31340 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  hat the new divi
31350 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61  der cell.  ** ma
31360 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49  y be inserted. I
31370 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65  f both these ope
31380 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63  rations are succ
31390 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e  essful, proceed.
313a0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
313b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
313c0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
313d0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69  New, 0, 0);..  i
313e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
313f0 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75   ){..    u8 *pOu
31400 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a  t = &pSpace[4];.
31410 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
31420 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d  pPage->apOvfl[0]
31430 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c  ;.    u16 szCell
31440 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
31450 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
31460 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20    u8 *pStop;..  
31470 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31480 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
31490 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
314a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
314b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d  pPage->aData[0]=
314c0 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  =(PTF_INTKEY|PTF
314d0 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
314e0 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  AF) );.    zeroP
314f0 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e  age(pNew, PTF_IN
31500 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
31510 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20  A|PTF_LEAF);.   
31520 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
31530 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
31540 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a  szCell);..    /*
31550 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
31560 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
31570 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
31580 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
31590 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
315a0 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
315b0 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
315c0 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
315d0 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
315e0 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
315f0 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68  ow page. If eith
31600 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20  er of these.    
31610 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61  ** operations fa
31620 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ils, the return 
31630 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74  code is set, but
31640 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
31650 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65    ** of the pare
31660 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c  nt page are stil
31670 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79  l manipulated by
31680 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e   thh code below.
31690 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20  .    ** That is 
316a0 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Ok, at this poin
316b0 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
316c0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
316d0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72  to.    ** be mar
316e0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65  ked as dirty. Re
316f0 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
31700 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65   code will cause
31710 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61   a.    ** rollba
31720 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20  ck, undoing any 
31730 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
31740 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
31750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31760 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
31770 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
31780 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
31790 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
317a0 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  ent->pgno, &rc);
317b0 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c  .      if( szCel
317c0 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  l>pNew->minLocal
317d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d   ){.        ptrm
317e0 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65  apPutOvflPtr(pNe
317f0 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  w, pCell, &rc);.
31800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31810 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
31820 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f   divider cell to
31830 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61   insert into pPa
31840 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65  rent. The divide
31850 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  r cell.    ** co
31860 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79  nsists of a 4-by
31870 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  te page number (
31880 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
31890 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20  of pPage) and.  
318a0 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20    ** a variable 
318b0 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65  length key value
318c0 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
318d0 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61  the same value a
318e0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72  s the.    ** lar
318f0 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67  gest key on pPag
31900 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e)..    **.    *
31910 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  * To find the la
31920 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20  rgest key value 
31930 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20  on pPage, first 
31940 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d  find the right-m
31950 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  ost .    ** cell
31960 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66   on pPage. The f
31970 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20  irst two fields 
31980 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65  of this cell are
31990 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63   the .    ** rec
319a0 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61  ord-length (a va
319b0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
319c0 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32  teger at most 32
319d0 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20  -bits in size). 
319e0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65     ** and the ke
319f0 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61  y value (a varia
31a00 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
31a10 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79  er, may have any
31a20 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20   value)..    ** 
31a30 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65  The first of the
31a40 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
31a50 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76  s below skips ov
31a60 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65  er the record-le
31a70 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ngth.    ** fiel
31a80 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68  d. The second wh
31a90 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f  ile(...) loop co
31aa0 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c  pies the key val
31ab0 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ue from the.    
31ac0 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
31ad0 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65   into the pSpace
31ae0 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a   buffer..    */.
31af0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
31b00 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
31b10 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
31b20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
31b30 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
31b40 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29  *(pCell++)&0x80)
31b50 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
31b60 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
31b70 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
31b80 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29  ile( ((*(pOut++)
31b90 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30   = *(pCell++))&0
31ba0 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
31bb0 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  top );..    /* I
31bc0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69  nsert the new di
31bd0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
31be0 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  pParent. */.    
31bf0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
31c00 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  nt, pParent->nCe
31c10 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74  ll, pSpace, (int
31c20 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a  )(pOut-pSpace),.
31c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
31c40 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26  , pPage->pgno, &
31c50 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  rc);..    /* Set
31c60 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
31c70 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72   pointer of pPar
31c80 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ent to point to 
31c90 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
31ca0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
31cb0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
31cc0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
31cd0 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20  +8], pgnoNew);. 
31ce0 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65   .    /* Release
31cf0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
31d00 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
31d10 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  */.    releasePa
31d20 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ge(pNew);.  }.. 
31d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
31d40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
31d50 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
31d60 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a   */..#if 0./*.**
31d70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
31d80 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75  oes not contribu
31d90 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  te anything to t
31da0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  he operation of 
31db0 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73  SQLite..** it is
31dc0 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76   sometimes activ
31dd0 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79  ated temporarily
31de0 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67   while debugging
31df0 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c   code responsibl
31e00 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e  e .** for settin
31e10 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  g pointer-map en
31e20 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
31e30 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b   int ptrmapCheck
31e40 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a  Pages(MemPage **
31e50 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67  apPage, int nPag
31e60 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  e){.  int i, j;.
31e70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61    for(i=0; i<nPa
31e80 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67  ge; i++){.    Pg
31e90 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a  no n;.    u8 e;.
31ea0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
31eb0 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a  ge = apPage[i];.
31ec0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
31ed0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
31ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31ef0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
31f00 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61    for(j=0; j<pPa
31f10 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b  ge->nCell; j++){
31f20 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  .      CellInfo 
31f30 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a  info;.      u8 *
31f40 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a  z;.     .      z
31f50 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
31f60 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72  e, j);.      btr
31f70 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
31f80 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b  Page, z, &info);
31f90 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e  .      if( info.
31fa0 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
31fb0 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
31fc0 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66   get4byte(&z[inf
31fd0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
31fe0 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74         ptrmapGet
31ff0 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20  (pBt, ovfl, &e, 
32000 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
32010 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
32020 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
32030 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20  _OVERFLOW1 );.  
32040 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32050 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
32060 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69          Pgno chi
32070 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29  ld = get4byte(z)
32080 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
32090 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20  Get(pBt, child, 
320a0 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
320b0 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
320c0 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
320d0 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
320e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
320f0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
32100 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
32110 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
32120 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
32130 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
32140 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  ]);.      ptrmap
32150 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20  Get(pBt, child, 
32160 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61  &e, &n);.      a
32170 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
32180 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
32190 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
321a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
321b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
321c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
321d0 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  is used to copy 
321e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
321f0 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
32200 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61  stored .** on pa
32210 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65  ge pFrom to page
32220 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46   pTo. If page pF
32230 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65  rom was not a le
32240 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a  af page, then.**
32250 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
32260 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
32270 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65  h child page are
32280 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
32290 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70   the.** parent p
322a0 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  age stored in th
322b0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73  e pointer map is
322c0 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46   page pTo. If pF
322d0 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a  rom contained.**
322e0 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20   any cells with 
322f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
32300 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65  inters, then the
32310 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
32320 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
32330 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75  tries are also u
32340 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
32350 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69  he parent page i
32360 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a  s page pTo..**.*
32370 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75  * If pFrom is cu
32380 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67  rrently carrying
32390 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65   any overflow ce
323a0 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20  lls (entries in 
323b0 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  the.** MemPage.a
323c0 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20  pOvfl[] array), 
323d0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70  they are not cop
323e0 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a  ied to pTo. .**.
323f0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
32400 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73  ing, page pTo is
32410 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75   reinitialized u
32420 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61  sing btreeInitPa
32430 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ge()..**.** The 
32440 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74  performance of t
32450 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32460 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74  not critical. It
32470 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
32480 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65   .** the balance
32490 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64  _shallower() and
324a0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
324b0 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65  ) procedures, ne
324c0 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63  ither of.** whic
324d0 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74  h are called oft
324e0 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20  en under normal 
324f0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a  circumstances..*
32500 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
32510 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65  pyNodeContent(Me
32520 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65  mPage *pFrom, Me
32530 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20  mPage *pTo, int 
32540 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
32550 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
32560 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
32570 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72   const pBt = pFr
32580 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20  om->pBt;.    u8 
32590 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20  * const aFrom = 
325a0 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20  pFrom->aData;.  
325b0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f    u8 * const aTo
325c0 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20   = pTo->aData;. 
325d0 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72     int const iFr
325e0 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68  omHdr = pFrom->h
325f0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e  drOffset;.    in
32600 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d  t const iToHdr =
32610 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29   ((pTo->pgno==1)
32620 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20   ? 100 : 0);.   
32630 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
32640 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20   iData;.  .  .  
32650 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
32660 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61  >isInit );.    a
32670 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46  ssert( pFrom->nF
32680 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20  ree>=iToHdr );. 
32690 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
326a0 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
326b0 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29  Hdr+5]) <= (int)
326c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
326d0 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70  );.  .    /* Cop
326e0 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  y the b-tree nod
326f0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  e content from p
32700 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
32710 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44  e pTo. */.    iD
32720 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26  ata = get2byte(&
32730 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
32740 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
32750 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72  aTo[iData], &aFr
32760 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e  om[iData], pBt->
32770 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61  usableSize-iData
32780 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
32790 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72  To[iToHdr], &aFr
327a0 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46  om[iFromHdr], pF
327b0 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  rom->cellOffset 
327c0 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c  + 2*pFrom->nCell
327d0 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69  );.  .    /* Rei
327e0 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70  nitialize page p
327f0 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  To so that the c
32800 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d  ontents of the M
32810 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
32820 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68  .    ** match th
32830 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20  e new data. The 
32840 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
32850 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c  f pTo can actual
32860 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20  ly fail under.  
32870 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63    ** fairly obsc
32880 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65  ure circumstance
32890 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  s, even though i
328a0 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69  t is a copy of i
328b0 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20  nitialized .    
328c0 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20  ** page pFrom.. 
328d0 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69     */.    pTo->i
328e0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72  sInit = 0;.    r
328f0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
32900 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20  e(pTo);.    if( 
32910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32920 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
32930 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
32940 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
32950 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
32960 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
32970 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
32980 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
32990 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e  es.    ** for an
329a0 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72  y b-tree or over
329b0 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
329c0 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  pTo now contains
329d0 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f   the pointers to
329e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
329f0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
32a00 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65  .      *pRC = se
32a10 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54  tChildPtrmaps(pT
32a20 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  o);.    }.  }.}.
32a30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
32a40 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65  ine redistribute
32a50 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  s cells on the i
32a60 50 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69  ParentIdx'th chi
32a70 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a  ld of pParent.**
32a80 20 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65   (hereafter "the
32a90 20 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74   page") and up t
32aa0 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20  o 2 siblings so 
32ab0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68  that all pages h
32ac0 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a  ave about the.**
32ad0 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20   same amount of 
32ae0 66 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61  free space. Usua
32af0 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62  lly a single sib
32b00 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73  ling on either s
32b10 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  ide of the.** pa
32b20 67 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  ge are used in t
32b30 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  he balancing, th
32b40 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e  ough both siblin
32b50 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
32b60 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69  om one.** side i
32b70 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68  f the page is th
32b80 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20  e first or last 
32b90 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
32ba0 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65  ent. If the page
32bb0 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74   .** has fewer t
32bc0 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28  han 2 siblings (
32bd0 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
32be0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
32bf0 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  if the page.** i
32c00 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72  s a root page or
32c10 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f   a child of a ro
32c20 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c  ot page) then al
32c30 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c  l available sibl
32c40 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70  ings.** particip
32c50 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
32c60 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
32c70 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
32c80 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d  gs of the page m
32c90 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
32ca0 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
32cb0 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f  y .** one or two
32cc0 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
32cd0 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
32ce0 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
32cf0 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a  over full. .**.*
32d00 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
32d10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
32d20 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
32d30 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68   the cells on th
32d40 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20  e page.** might 
32d50 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
32d60 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67  stored in MemPag
32d70 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20  e.aData[]. This 
32d80 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
32d90 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
32da0 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74  rfull. This rout
32db0 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
32dc0 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63   all cells alloc
32dd0 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70  ated.** to the p
32de0 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
32df0 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65  ings fit into Me
32e00 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65  mPage.aData[] be
32e10 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
32e20 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
32e30 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
32e40 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
32e50 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c  s siblings, cell
32e60 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65  s may be.** inse
32e70 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d  rted into or rem
32e80 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
32e90 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65  rent page (pPare
32ea0 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a  nt). Doing so.**
32eb0 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70   may cause the p
32ec0 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65  arent page to be
32ed0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
32ee0 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74   underfull. If t
32ef0 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20  his.** happens, 
32f00 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
32f10 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
32f20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65  caller to invoke
32f30 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
32f40 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  balancing routin
32f50 65 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72  e to fix this pr
32f60 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62  oblem (see the b
32f70 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65  alance() routine
32f80 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ). .**.** If thi
32f90 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
32fa0 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
32fb0 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74  it might leave t
32fc0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
32fd0 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74  n a corrupted st
32fe0 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20  ate. So if this 
32ff0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
33000 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
33010 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
33020 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  back..**.** The 
33030 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
33040 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
33050 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20   aOvflSpace, is 
33060 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a  a pointer to a.*
33070 2a 20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f  * buffer big eno
33080 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20  ugh to hold one 
33090 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69  page. If while i
330a0 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69  nserting cells i
330b0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a  nto the parent.*
330c0 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29  * page (pParent)
330d0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
330e0 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c   becomes overful
330f0 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69  l, this buffer i
33100 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f  s.** used to sto
33110 72 65 20 74 68 65 20 70 61 72 65 6e 74 27 73 20  re the parent's 
33120 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
33130 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  Because this fun
33140 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a  ction inserts.**
33150 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f   a maximum of fo
33160 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ur divider cells
33170 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
33180 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d   page, and the m
33190 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f  aximum.** size o
331a0 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20  f a cell stored 
331b0 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e  within an intern
331c0 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  al node is alway
331d0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a  s less than 1/4.
331e0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  ** of the page-s
331f0 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70  ize, the aOvflSp
33200 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20  ace[] buffer is 
33210 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
33220 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68   large.** enough
33230 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f   for all overflo
33240 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  w cells..**.** I
33250 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20  f aOvflSpace is 
33260 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f  set to a null po
33270 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
33280 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
33290 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
332a0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d  /.#if defined(_M
332b0 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f  SC_VER) && _MSC_
332c0 56 45 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64  VER >= 1700 && d
332d0 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23  efined(_M_ARM).#
332e0 70 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28  pragma optimize(
332f0 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a  "", off).#endif.
33300 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
33310 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65  ce_nonroot(.  Me
33320 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
33330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33340 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20   Parent page of 
33350 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62  siblings being b
33360 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
33370 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20   iParentIdx,    
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33390 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61  Index of "the pa
333a0 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  ge" in pParent *
333b0 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61  /.  u8 *aOvflSpa
333c0 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
333d0 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65      /* page-size
333e0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
333f0 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20  for parent ovfl 
33400 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c  */.  int isRoot,
33410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33420 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
33430 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f  pParent is a roo
33440 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  t-page */.  int 
33450 62 42 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20  bBulk           
33460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
33470 72 75 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c  rue if this call
33480 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 62 75   is part of a bu
33490 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  lk load */.){.  
334a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
334b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
334c0 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61  The whole databa
334d0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  se */.  int nCel
334e0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
334f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
33500 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
33510 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  l[] */.  int nMa
33520 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20  xCells = 0;     
33530 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
33540 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c  ed size of apCel
33550 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d  l, szCell, aFrom
33560 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20  . */.  int nNew 
33570 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33580 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33590 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b   pages in apNew[
335a0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b  ] */.  int nOld;
335b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
335d0 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b   pages in apOld[
335e0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ] */.  int i, j,
335f0 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
33600 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
33610 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78  ters */.  int nx
33620 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
33630 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
33640 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70  ivider slot in p
33650 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
33660 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
33670 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
33680 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
33690 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65  code */.  u16 le
336a0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20  afCorrection;   
336b0 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70         /* 4 if p
336c0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
336d0 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69   0 if not */.  i
336e0 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20  nt leafData;    
336f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
33700 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20  rue if pPage is 
33710 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46  a leaf of a LEAF
33720 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69  DATA tree */.  i
33730 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20  nt usableSpace; 
33740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
33750 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65  ytes in pPage be
33760 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20  yond the header 
33770 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61  */.  int pageFla
33780 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
33790 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50    /* Value of pP
337a0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f  age->aData[0] */
337b0 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b  .  int subtotal;
337c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337d0 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62  /* Subtotal of b
337e0 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e  ytes in cells on
337f0 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   one page */.  i
33800 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20  nt iSpace1 = 0; 
33810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
33820 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
33830 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f   of aSpace1[] */
33840 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63  .  int iOvflSpac
33850 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
33860 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
33870 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61  byte of aOvflSpa
33880 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ce[] */.  int sz
33890 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20  Scratch;        
338a0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
338b0 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79  f scratch memory
338c0 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
338d0 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e  MemPage *apOld[N
338e0 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  B];          /* 
338f0 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
33900 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  two siblings */.
33910 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
33920 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
33930 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
33940 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
33950 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
33960 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
33970 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
33980 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
33990 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
339a0 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67  ng */.  u8 *pRig
339b0 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ht;             
339c0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e       /* Location
339d0 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69   in parent of ri
339e0 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e  ght-sibling poin
339f0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44  ter */.  u8 *apD
33a00 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20  iv[NB-1];       
33a10 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72        /* Divider
33a20 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
33a30 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65  t */.  int cntNe
33a40 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
33a50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
33a60 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20  aCell[] of cell 
33a70 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20  after i-th page 
33a80 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e  */.  int szNew[N
33a90 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
33aa0 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69    /* Combined si
33ab0 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63  ze of cells plac
33ac0 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a  e on i-th page *
33ad0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20  /.  u8 **apCell 
33ae0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33af0 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65   /* All cells be
33b00 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  gin balanced */.
33b10 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20    u16 *szCell;  
33b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33b30 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
33b40 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
33b50 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  ell[] */.  u8 *a
33b60 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20  Space1;         
33b70 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
33b80 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64   for copies of d
33b90 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f  ividers cells */
33ba0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
33bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33bc0 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73  /* Temp var to s
33bd0 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62  tore a page numb
33be0 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20  er in */..  pBt 
33bf0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a  = pParent->pBt;.
33c00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33c10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
33c20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
33c30 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
33c40 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
33c50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
33c60 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43  );..#if 0.  TRAC
33c70 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
33c80 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
33c90 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
33ca0 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
33cb0 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a  >pgno));.#endif.
33cc0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
33cd0 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20  int pParent may 
33ce0 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
33cf0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20   overflow cell. 
33d00 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73  And if.  ** this
33d10 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69   overflow cell i
33d20 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75  s present, it mu
33d30 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77  st be the cell w
33d40 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ith .  ** index 
33d50 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73  iParentIdx. This
33d60 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20   scenario comes 
33d70 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20  about when this 
33d80 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
33d90 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63   called (indirec
33da0 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65  tly) from sqlite
33db0 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a  3BtreeDelete()..
33dc0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
33dd0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
33de0 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
33df0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
33e00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
33e10 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
33e20 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f   || pParent->aiO
33e30 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49  vfl[0]==iParentI
33e40 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f  dx );..  if( !aO
33e50 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20  vflSpace ){.    
33e60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
33e70 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
33e80 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20  ind the sibling 
33e90 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65  pages to balance
33ea0 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68  . Also locate th
33eb0 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
33ec0 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69  nt .  ** that di
33ed0 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67  vide the sibling
33ee0 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  s. An attempt is
33ef0 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
33f00 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20   siblings on .  
33f10 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  ** either side o
33f20 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69  f pPage. More si
33f30 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
33f40 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
33f50 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69  however, .  ** i
33f60 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  f there are fewe
33f70 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
33f80 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
33f90 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74  side. If pParent
33fa0 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
33fb0 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
33fc0 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
33fd0 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
33fe0 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  taken.  .  **.  
33ff0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
34000 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69  o drops the divi
34010 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  der cells from t
34020 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
34030 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74  This.  ** way, t
34040 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
34050 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
34060 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65  s not have to de
34070 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a  al with any.  **
34080 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
34090 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
340a0 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79  ge, since if any
340b0 20 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69   existed they wi
340c0 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72  ll.  ** have alr
340d0 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65  eady been remove
340e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50  d..  */.  i = pP
340f0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
34100 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   + pParent->nCel
34110 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a  l;.  if( i<2 ){.
34120 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
34130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
34140 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20  rt( bBulk==0 || 
34150 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20  bBulk==1 );.    
34160 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
34170 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
34180 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
34190 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
341a0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
341b0 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
341c0 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20  v = i-2+bBulk;. 
341d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
341e0 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30  assert( bBulk==0
341f0 20 29 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   );.      nxDiv 
34200 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
34210 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d      }.    i = 2-
34220 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c  bBulk;.  }.  nOl
34230 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28  d = i+1;.  if( (
34240 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
34250 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61  >nOverflow)==pPa
34260 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
34270 20 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61     pRight = &pPa
34280 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
34290 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
342a0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
342b0 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c  pRight = findCel
342c0 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
342d0 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
342e0 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67  rflow);.  }.  pg
342f0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52  no = get4byte(pR
34300 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  ight);.  while( 
34310 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  1 ){.    rc = ge
34320 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
34330 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69  , pgno, &apOld[i
34340 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  ], 0);.    if( r
34350 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  c ){.      memse
34360 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31  t(apOld, 0, (i+1
34370 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  )*sizeof(MemPage
34380 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  *));.      goto 
34390 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
343a0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43  .    }.    nMaxC
343b0 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b  ells += 1+apOld[
343c0 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b  i]->nCell+apOld[
343d0 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  i]->nOverflow;. 
343e0 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20     if( (i--)==0 
343f0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66  ) break;..    if
34400 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65  ( i+nxDiv==pPare
34410 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26  nt->aiOvfl[0] &&
34420 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
34430 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44  low ){.      apD
34440 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d  iv[i] = pParent-
34450 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20  >apOvfl[0];.    
34460 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
34470 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
34480 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
34490 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
344a0 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
344b0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76      pParent->nOv
344c0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
344d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44  }else{.      apD
344e0 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
344f0 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
34500 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
34510 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e  flow);.      pgn
34520 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
34530 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
34540 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
34550 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
34560 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20  Div[i]);..      
34570 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c  /* Drop the cell
34580 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
34590 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20   page. apDiv[i] 
345a0 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a  still points to.
345b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c        ** the cel
345c0 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72  l within the par
345d0 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ent, even though
345e0 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f   it has been dro
345f0 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54  pped..      ** T
34600 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
34610 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63  use dropping a c
34620 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69  ell only overwri
34630 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20  tes the first.  
34640 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
34650 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69  s of it, and thi
34660 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
34670 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72  not need the fir
34680 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
34690 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69   bytes of the di
346a0 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74  vider cell. So t
346b0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61  he pointer is sa
346c0 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20  fe to use.      
346d0 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20  ** later on.  . 
346e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
346f0 20 42 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61   But not if we a
34700 72 65 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c  re in secure-del
34710 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63  ete mode. In sec
34720 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c  ure-delete mode,
34730 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72  .      ** the dr
34740 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65  opCell() routine
34750 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
34760 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
34770 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20  with zeroes..   
34780 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
34790 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  se, temporarily 
347a0 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e  copy the cell in
347b0 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  to the aOvflSpac
347c0 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66  e[].      ** buf
347d0 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20  fer. It will be 
347e0 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e  copied out again
347f0 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
34800 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a  aSpace[] buffer.
34810 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f        ** is allo
34820 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  cated.  */.     
34830 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
34840 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
34850 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20  DELETE ){.      
34860 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20    int iOff;..   
34870 20 20 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49       iOff = SQLI
34880 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70  TE_PTR_TO_INT(ap
34890 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45  Div[i]) - SQLITE
348a0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72  _PTR_TO_INT(pPar
348b0 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ent->aData);.   
348c0 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73       if( (iOff+s
348d0 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42  zNew[i])>(int)pB
348e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
348f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
34900 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34910 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  KPT;.          m
34920 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20  emset(apOld, 0, 
34930 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d  (i+1)*sizeof(Mem
34940 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20  Page*));.       
34950 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
34960 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
34970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34980 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53    memcpy(&aOvflS
34990 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69  pace[iOff], apDi
349a0 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b  v[i], szNew[i]);
349b0 0a 20 20 20 20 20 20 20 20 20 20 61 70 44 69 76  .          apDiv
349c0 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  [i] = &aOvflSpac
349d0 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65  e[apDiv[i]-pPare
349e0 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20  nt->aData];.    
349f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34a00 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
34a10 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
34a20 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
34a30 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29  , szNew[i], &rc)
34a40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
34a50 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
34a60 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34   a multiple of 4
34a70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
34a80 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
34a90 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
34aa0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
34ab0 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b  axCells + 3)&~3;
34ac0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
34ad0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
34ae0 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
34af0 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d  .  */.  k = pBt-
34b00 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e  >pageSize + ROUN
34b10 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
34b20 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68  e));.  szScratch
34b30 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65   =.       nMaxCe
34b40 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20  lls*sizeof(u8*) 
34b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b60 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20        /* apCell 
34b70 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65  */.     + nMaxCe
34b80 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20  lls*sizeof(u16) 
34b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ba0 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20        /* szCell 
34bb0 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
34bc0 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20  ageSize         
34bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34be0 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31        /* aSpace1
34bf0 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c   */.     + k*nOl
34c00 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
34c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
34c30 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a  opies (apCopy) *
34c40 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  /.  apCell = sql
34c50 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
34c60 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20  c( szScratch ); 
34c70 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
34c80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
34c90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
34ca0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
34cb0 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c  nup;.  }.  szCel
34cc0 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
34cd0 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
34ce0 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26  aSpace1 = (u8*)&
34cf0 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
34d00 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
34d10 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
34d20 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20  T(aSpace1) );.. 
34d30 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
34d40 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
34d50 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
34d60 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
34d70 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
34d80 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
34d90 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
34da0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
34db0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
34dc0 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
34dd0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
34de0 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d  Space1[] and rem
34df0 6f 76 65 20 74 68 65 20 64 69 76 69 64 65 72 20  ove the divider 
34e00 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  cells.  ** from 
34e10 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  pParent..  **.  
34e20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  ** If the siblin
34e30 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70  gs are on leaf p
34e40 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ages, then the c
34e50 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66  hild pointers of
34e60 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65   the.  ** divide
34e70 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69  r cells are stri
34e80 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65  pped from the ce
34e90 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20  lls before they 
34ea0 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20  are copied.  ** 
34eb0 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20  into aSpace1[]. 
34ec0 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c   In this way, al
34ed0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
34ee0 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a  l[] are without.
34ef0 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74    ** child point
34f00 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67  ers.  If sibling
34f10 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
34f20 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20  , then all cell 
34f30 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d  in.  ** apCell[]
34f40 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70   include child p
34f50 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72  ointers.  Either
34f60 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
34f70 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a  in apCell[].  **
34f80 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a   are alike..  **
34f90 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63  .  ** leafCorrec
34fa0 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67  tion:  4 if pPag
34fb0 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
34fc0 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  if pPage is not 
34fd0 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20  a leaf..  **    
34fe0 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20     leafData:  1 
34ff0 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b  if pPage holds k
35000 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72  ey+data and pPar
35010 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b  ent holds only k
35020 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66  eys..  */.  leaf
35030 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f  Correction = apO
35040 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20  ld[0]->leaf*4;. 
35050 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c   leafData = apOl
35060 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20  d[0]->hasData;. 
35070 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
35080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
35090 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20  limit;.    .    
350a0 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  /* Before doing 
350b0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74  anything else, t
350c0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
350d0 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20  e i'th original 
350e0 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54  sibling.    ** T
350f0 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
35100 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  function will us
35110 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
35120 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20  copies rather.  
35130 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72    ** that the or
35140 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e  iginal pages sin
35150 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ce the original 
35160 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e  pages will be in
35170 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63   the.    ** proc
35180 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65  ess of being ove
35190 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
351a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
351b0 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d  = apCopy[i] = (M
351c0 65 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65 31  emPage*)&aSpace1
351d0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b  [pBt->pageSize +
351e0 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70   k*i];.    memcp
351f0 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d  y(pOld, apOld[i]
35200 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  , sizeof(MemPage
35210 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44  ));.    pOld->aD
35220 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f  ata = (void*)&pO
35230 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ld[1];.    memcp
35240 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61  y(pOld->aData, a
35250 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20  pOld[i]->aData, 
35260 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
35270 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c  .    limit = pOl
35280 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e  d->nCell+pOld->n
35290 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66  Overflow;.    if
352a0 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pOld->nOverflo
352b0 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  w>0 ){.      for
352c0 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
352d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
352e0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
352f0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20  ells );.        
35300 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
35310 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
35320 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
35330 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
35340 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
35350 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c  Old, apCell[nCel
35360 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65  l]);.        nCe
35370 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ll++;.      }.  
35380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
35390 38 20 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d  8 *aData = pOld-
353a0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31  >aData;.      u1
353b0 36 20 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c  6 maskPage = pOl
353c0 64 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20  d->maskPage;.   
353d0 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
353e0 74 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66  t = pOld->cellOf
353f0 66 73 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  fset;.      for(
35400 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
35410 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
35420 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
35430 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61  lls );.        a
35440 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
35450 69 6e 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c  indCellv2(aData,
35460 20 6d 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f   maskPage, cellO
35470 66 66 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20  ffset, j);.     
35480 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
35490 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
354a0 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c  Old, apCell[nCel
354b0 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65  l]);.        nCe
354c0 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ll++;.      }.  
354d0 20 20 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69    }       .    i
354e0 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21  f( i<nOld-1 && !
354f0 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20  leafData){.     
35500 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73   u16 sz = (u16)s
35510 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75  zNew[i];.      u
35520 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
35530 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
35540 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
35550 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
35560 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70   sz;.      pTemp
35570 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61   = &aSpace1[iSpa
35580 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61  ce1];.      iSpa
35590 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce1 += sz;.     
355a0 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
355b0 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b  ->maxLocal+23 );
355c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
355d0 53 70 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70  Space1 <= (int)p
355e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
355f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
35600 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  mp, apDiv[i], sz
35610 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
35620 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c  nCell] = pTemp+l
35630 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
35640 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
35650 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c  fCorrection==0 |
35660 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  | leafCorrection
35670 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  ==4 );.      szC
35680 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43  ell[nCell] = szC
35690 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61  ell[nCell] - lea
356a0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
356b0 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65     if( !pOld->le
356c0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  af ){.        as
356d0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
356e0 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  tion==0 );.     
356f0 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d     assert( pOld-
35700 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b  >hdrOffset==0 );
35710 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
35720 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66  right pointer of
35730 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
35740 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65  pOld becomes the
35750 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a   left.        **
35760 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
35770 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
35780 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
35790 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70  pCell[nCell], &p
357a0 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34  Old->aData[8], 4
357b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
357c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
357d0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
357e0 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4 );.        if(
357f0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34   szCell[nCell]<4
35800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
35810 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e   Do not allow an
35820 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20  y cells smaller 
35830 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f  than 4 bytes. */
35840 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c  .          szCel
35850 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20  l[nCell] = 4;.  
35860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35870 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
35880 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
35890 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   ** Figure out t
358a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
358b0 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  es needed to hol
358c0 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c  d all nCell cell
358d0 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68  s..  ** Store th
358e0 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22  is number in "k"
358f0 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20  .  Also compute 
35900 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  szNew[] which is
35910 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20   the total.  ** 
35920 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
35930 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61  s on the i-th pa
35940 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20  ge and cntNew[] 
35950 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64  which is the ind
35960 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c  ex.  ** in apCel
35970 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  l[] of the cell 
35980 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67  that divides pag
35990 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b  e i from page i+
359a0 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77  1.  .  ** cntNew
359b0 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c  [k] should equal
359c0 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a   nCell..  **.  *
359d0 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65  * Values compute
359e0 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a  d by this block:
359f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
35a00 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61       k: The tota
35a10 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  l number of sibl
35a20 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20  ing pages.  **  
35a30 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63    szNew[i]: Spac
35a40 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69  ed used on the i
35a50 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
35a60 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b  ..  **   cntNew[
35a70 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43  i]: Index in apC
35a80 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c  ell[] and szCell
35a90 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  [] for the first
35aa0 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20   cell to.  **   
35ab0 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72             the r
35ac0 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68  ight of the i-th
35ad0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
35ae0 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a   ** usableSpace:
35af0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
35b00 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61   of space availa
35b10 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c  ble on each sibl
35b20 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a  ing..  ** .  */.
35b30 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20    usableSpace = 
35b40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35b50 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65  - 12 + leafCorre
35b60 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62  ction;.  for(sub
35b70 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e  total=k=i=0; i<n
35b80 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
35b90 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65  assert( i<nMaxCe
35ba0 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f  lls );.    subto
35bb0 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d  tal += szCell[i]
35bc0 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75   + 2;.    if( su
35bd0 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53  btotal > usableS
35be0 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a  pace ){.      sz
35bf0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
35c00 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20  l - szCell[i];. 
35c10 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d       cntNew[k] =
35c20 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65   i;.      if( le
35c30 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d  afData ){ i--; }
35c40 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20  .      subtotal 
35c50 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a  = 0;.      k++;.
35c60 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31        if( k>NB+1
35c70 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   ){ rc = SQLITE_
35c80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f  CORRUPT_BKPT; go
35c90 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
35ca0 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a  up; }.    }.  }.
35cb0 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
35cc0 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
35cd0 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
35ce0 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
35cf0 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
35d00 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
35d10 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
35d20 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
35d30 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
35d40 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
35d50 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
35d60 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
35d70 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
35d80 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
35d90 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
35da0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
35db0 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
35dc0 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
35dd0 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
35de0 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
35df0 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
35e00 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
35e10 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
35e20 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
35e30 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
35e40 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
35e50 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
35e60 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
35e70 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
35e80 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
35e90 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
35ea0 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
35eb0 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
35ec0 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
35ed0 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
35ee0 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
35ef0 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
35f00 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
35f10 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
35f20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
35f30 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
35f40 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
35f50 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
35f60 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
35f70 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
35f80 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
35f90 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
35fa0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
35fb0 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
35fc0 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
35fd0 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
35fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35ff0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
36000 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
36010 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
36020 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
36030 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
36040 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
36050 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
36060 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
36070 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36080 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
36090 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
360a0 74 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  t==0 .       || 
360b0 28 21 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67  (!bBulk && szRig
360c0 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
360d0 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
360e0 5d 2b 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20  ]+2)) .    ){.  
360f0 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
36100 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
36110 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
36120 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
36130 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
36140 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
36150 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
36160 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
36170 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
36180 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
36190 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
361a0 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
361b0 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
361c0 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
361d0 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
361e0 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50  new[0])>0) or pP
361f0 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69  age is.  ** a vi
36200 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
36210 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
36220 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
36230 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
36240 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
36250 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
36260 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
36270 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  t page..  **.  *
36280 2a 20 55 50 44 41 54 45 3a 20 20 54 68 65 20 61  * UPDATE:  The a
36290 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73  ssert() below is
362a0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
362b0 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74   true if the dat
362c0 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20  abase.  ** file 
362d0 69 73 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65  is corrupt.  The
362e0 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
362f0 20 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64   be detected and
36300 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a   reported later.
36310 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f    ** in this pro
36320 63 65 64 75 72 65 20 73 6f 20 74 68 65 72 65 20  cedure so there 
36330 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63  is no need to ac
36340 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20  t upon it now.. 
36350 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
36360 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
36370 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
36380 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
36390 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65  >nCell==0) );.#e
363a0 6e 64 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22  ndif..  TRACE(("
363b0 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
363c0 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61   %d %d  ",.    a
363d0 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a  pOld[0]->pgno, .
363e0 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70      nOld>=2 ? ap
363f0 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[1]->pgno : 0
36400 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
36410 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apOld[2]->pgno :
36420 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20   0.  ));..  /*. 
36430 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
36440 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
36450 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
36460 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
36470 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e    if( apOld[0]->
36480 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72  pgno<=1 ){.    r
36490 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
364a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
364b0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
364c0 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61  p;.  }.  pageFla
364d0 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61  gs = apOld[0]->a
364e0 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
364f0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
36500 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
36510 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
36520 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
36530 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
36540 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
36550 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
36560 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36570 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
36580 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
36590 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
365a0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
365b0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
365c0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
365d0 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
365e0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
365f0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
36600 77 2c 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b  w, &pgno, (bBulk
36610 20 3f 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29   ? 1 : pgno), 0)
36620 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
36630 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
36640 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e  eanup;.      apN
36650 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  ew[i] = pNew;.  
36660 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20      nNew++;..   
36670 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f     /* Set the po
36680 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
36690 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c  for the new sibl
366a0 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
366b0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
366c0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70  UUM ){.        p
366d0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e  trmapPut(pBt, pN
366e0 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ew->pgno, PTRMAP
366f0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
36700 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
36710 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36730 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
36740 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
36750 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36760 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  }.  }..  /* Free
36770 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
36780 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
36790 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
367a0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
367b0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72  i<nOld ){.    fr
367c0 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c  eePage(apOld[i],
367d0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
367e0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
367f0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
36800 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
36810 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
36820 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
36830 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
36840 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
36850 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
36860 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
36870 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
36880 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
36890 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
368a0 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
368b0 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
368c0 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
368d0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
368e0 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
368f0 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
36900 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
36910 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
36920 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
36930 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
36940 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
36950 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
36960 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
36970 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
36980 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
36990 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
369a0 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
369b0 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
369c0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
369d0 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
369e0 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
369f0 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
36a00 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
36a10 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
36a20 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
36a30 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
36a40 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
36a50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
36a60 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
36a70 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e    int minV = apN
36a80 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[i]->pgno;.   
36a90 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
36aa0 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
36ab0 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
36ac0 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e  f( apNew[j]->pgn
36ad0 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56  o<(unsigned)minV
36ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49   ){.        minI
36af0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69   = j;.        mi
36b00 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70  nV = apNew[j]->p
36b10 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
36b20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
36b30 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  i ){.      MemPa
36b40 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54  ge *pT;.      pT
36b50 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
36b60 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
36b70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
36b80 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
36b90 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
36ba0 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25  RACE(("new: %d(%
36bb0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
36bc0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
36bd0 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d  ",.    apNew[0]-
36be0 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c  >pgno, szNew[0],
36bf0 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61  .    nNew>=2 ? a
36c00 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[1]->pgno : 
36c10 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
36c20 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
36c30 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32  New>=3 ? apNew[2
36c40 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
36c50 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
36c60 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
36c70 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e   ? apNew[3]->pgn
36c80 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  o : 0, nNew>=4 ?
36c90 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
36ca0 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e     nNew>=5 ? apN
36cb0 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[4]->pgno : 0,
36cc0 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77   nNew>=5 ? szNew
36cd0 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73  [4] : 0));..  as
36ce0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
36cf0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
36d00 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
36d10 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52  );.  put4byte(pR
36d20 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77  ight, apNew[nNew
36d30 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f  -1]->pgno);..  /
36d40 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
36d50 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
36d60 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
36d70 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
36d80 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
36d90 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
36da0 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
36db0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
36dc0 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
36dd0 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
36de0 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
36df0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
36e00 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
36e10 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
36e20 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
36e30 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
36e40 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
36e50 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
36e60 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
36e70 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
36e80 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
36e90 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
36ea0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
36eb0 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
36ec0 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
36ed0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
36ee0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
36ef0 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a  low==0 );..    j
36f00 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
36f10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
36f20 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
36f30 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
36f40 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
36f50 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
36f60 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
36f70 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
36f80 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
36f90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36fa0 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e  i<nNew-1 || j==n
36fb0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
36fc0 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  j<nCell ){.     
36fd0 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
36fe0 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
36ff0 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20     int sz;..    
37000 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
37010 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70  Cells );.      p
37020 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d  Cell = apCell[j]
37030 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43  ;.      sz = szC
37040 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72  ell[j] + leafCor
37050 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70  rection;.      p
37060 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61  Temp = &aOvflSpa
37070 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a  ce[iOvflSpace];.
37080 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
37090 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
370a0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
370b0 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
370c0 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  4);.      }else 
370d0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
370e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
370f0 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66  e tree is a leaf
37100 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20  -data tree, and 
37110 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
37120 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20   leaves, .      
37130 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
37140 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65  is no divider ce
37150 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20  ll in apCell[]. 
37160 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76  Instead, the div
37170 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ider .        **
37180 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
37190 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
371a0 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  y for the right-
371b0 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20  most cell of .  
371c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62        ** the sib
371d0 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62  ling-page assemb
371e0 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a  led above only..
371f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37200 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
37210 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20  ;.        j--;. 
37220 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
37230 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
37240 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
37250 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
37260 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = pTemp;.       
37270 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72   sz = 4 + putVar
37280 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69  int(&pCell[4], i
37290 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20  nfo.nKey);.     
372a0 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20     pTemp = 0;.  
372b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
372c0 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20     pCell -= 4;. 
372d0 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72         /* Obscur
372e0 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c  e case for non-l
372f0 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20  eaf-data trees: 
37300 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70  If the cell at p
37310 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20  Cell was.       
37320 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73   ** previously s
37330 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20  tored on a leaf 
37340 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65  node, and its re
37350 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20  ported size was 
37360 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  4.        ** byt
37370 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  es, then it may 
37380 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c  actually be smal
37390 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20  ler than this . 
373a0 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62         ** (see b
373b0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
373c0 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
373d0 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
373e0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
373f0 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20  y cell). But it 
37400 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
37410 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
37420 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
37430 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
37440 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
37450 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
37460 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
37470 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
37480 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
37490 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
374a0 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
374b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
374c0 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
374d0 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
374e0 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
374f0 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
37500 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
37510 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
37520 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
37530 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
37540 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
37550 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
37560 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
37570 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
37580 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
37590 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
375a0 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
375b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
375c0 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65        iOvflSpace
375d0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73   += sz;.      as
375e0 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d  sert( sz<=pBt->m
375f0 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20  axLocal+23 );.  
37600 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 76 66      assert( iOvf
37610 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74 29 70  lSpace <= (int)p
37620 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
37630 20 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c        insertCell
37640 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
37650 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
37660 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26  p, pNew->pgno, &
37670 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
37680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
37690 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
376a0 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nup;.      asser
376b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
376c0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
376d0 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
376e0 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
376f0 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d    nxDiv++;.    }
37700 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
37710 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ==nCell );.  ass
37720 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20  ert( nOld>0 );. 
37730 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
37740 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c  );.  if( (pageFl
37750 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d  ags & PTF_LEAF)=
37760 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43  =0 ){.    u8 *zC
37770 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e  hild = &apCopy[n
37780 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  Old-1]->aData[8]
37790 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70  ;.    memcpy(&ap
377a0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61  New[nNew-1]->aDa
377b0 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34  ta[8], zChild, 4
377c0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  );.  }..  if( is
377d0 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d  Root && pParent-
377e0 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61  >nCell==0 && pPa
377f0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c  rent->hdrOffset<
37800 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65  =apNew[0]->nFree
37810 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
37820 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
37830 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61  b-tree now conta
37840 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68  ins no cells. Th
37850 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20  e only sibling. 
37860 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68     ** page is th
37870 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
37880 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70   the parent. Cop
37890 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
378a0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69  f the.    ** chi
378b0 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ld page into the
378c0 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73   parent, decreas
378d0 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ing the overall 
378e0 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20  height of the.  
378f0 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75    ** b-tree stru
37900 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68  cture by one. Th
37910 69 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20  is is described 
37920 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d  as the "balance-
37930 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a  shallower".    *
37940 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20  * sub-algorithm 
37950 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74  in some document
37960 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20  ation..    **.  
37970 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
37980 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
37990 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c  atabase, the cal
379a0 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  l to copyNodeCon
379b0 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73  tent() .    ** s
379c0 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d  ets all pointer-
379d0 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72  map entries corr
379e0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74  esponding to dat
379f0 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65  abase image page
37a00 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68  s .    ** for wh
37a10 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ich the pointer 
37a20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  is stored within
37a30 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   the content bei
37a40 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a  ng copied..    *
37a50 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
37a60 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77  ond assert below
37a70 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
37a80 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73  he child page is
37a90 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20   defragmented.  
37aa0 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65    ** (it must be
37ab0 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74  , as it was just
37ac0 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75   reconstructed u
37ad0 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67  sing assemblePag
37ae0 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a  e()). This.    *
37af0 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  * is important i
37b00 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
37b10 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
37b20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
37b30 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d  tabase.    ** im
37b40 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  age.  */.    ass
37b50 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a  ert( nNew==1 );.
37b60 20 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65      assert( apNe
37b70 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a  w[0]->nFree == .
37b80 20 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74          (get2byt
37b90 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61  e(&apNew[0]->aDa
37ba0 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d  ta[5])-apNew[0]-
37bb0 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65  >cellOffset-apNe
37bc0 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a  w[0]->nCell*2) .
37bd0 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e      );.    copyN
37be0 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77  odeContent(apNew
37bf0 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72  [0], pParent, &r
37c00 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65  c);.    freePage
37c10 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b  (apNew[0], &rc);
37c20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41  .  }else if( ISA
37c30 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
37c40 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e   /* Fix the poin
37c50 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
37c60 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  for all the cell
37c70 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66  s that were shif
37c80 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20  ted around. .   
37c90 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65   ** There are se
37ca0 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20  veral different 
37cb0 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72  types of pointer
37cc0 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61  -map entries tha
37cd0 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  t need to.    **
37ce0 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
37cf0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
37d00 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61  Some of these ha
37d10 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65  ve been set alre
37d20 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20  ady, but.    ** 
37d30 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54  many have not. T
37d40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
37d50 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a  a summary:.    *
37d60 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68  *.    **   1) Th
37d70 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
37d80 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69  ated with new si
37d90 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74  bling pages that
37da0 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a   were not.    **
37db0 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77        siblings w
37dc0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
37dd0 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68  n was called. Th
37de0 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79  ese have already
37df0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65  .    **      bee
37e00 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20  n set. We don't 
37e10 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62  need to worry ab
37e20 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73  out old siblings
37e30 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a   that were.    *
37e40 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20  *      moved to 
37e50 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20  the free-list - 
37e60 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63  the freePage() c
37e70 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61  ode has taken ca
37e80 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  re.    **      o
37e90 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a  f those..    **.
37ea0 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20      **   2) The 
37eb0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
37ec0 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
37ed0 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76  ith the first ov
37ee0 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20  erflow.    **   
37ef0 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f     page in any o
37f00 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75  verflow chains u
37f10 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64  sed by new divid
37f20 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20  er cells. These 
37f30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76  .    **      hav
37f40 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62  e also already b
37f50 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f  een taken care o
37f60 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43  f by the insertC
37f70 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20  ell() code..    
37f80 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49  **.    **   3) I
37f90 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
37fa0 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
37fb0 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
37fc0 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20  ld pages of.    
37fd0 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74  **      cells st
37fe0 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c  ored on the sibl
37ff0 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65  ing pages may ne
38000 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
38010 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
38020 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c    4) If the sibl
38030 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
38040 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65  t internal intke
38050 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e  y nodes, then an
38060 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76  y.    **      ov
38070 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65  erflow pages use
38080 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73  d by these cells
38090 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
380a0 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20  updated.    **  
380b0 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e      (internal in
380c0 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72  tkey nodes never
380d0 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
380e0 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  s to overflow pa
380f0 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ges)..    **.   
38100 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20   **   5) If the 
38110 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
38120 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
38130 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  en the pointer-m
38140 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65  ap.    **      e
38150 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72  ntries for the r
38160 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73  ight-child pages
38170 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67   of each sibling
38180 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
38190 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61        to be upda
381a0 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
381b0 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32  ** Cases 1 and 2
381c0 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20   are dealt with 
381d0 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63  above by other c
381e0 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20  ode. The next.  
381f0 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73    ** block deals
38200 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e   with cases 3 an
38210 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20  d 4 and the one 
38220 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65  after that, case
38230 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a   5. Since.    **
38240 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74   setting a point
38250 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20  er map entry is 
38260 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70  a relatively exp
38270 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
38280 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f  , this.    ** co
38290 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69  de only sets poi
382a0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
382b0 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76   for child or ov
382c0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
382d0 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63  t have.    ** ac
382e0 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74  tually moved bet
382f0 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a  ween pages.  */.
38300 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
38310 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20  w = apNew[0];.  
38320 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
38330 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20  = apCopy[0];.   
38340 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d   int nOverflow =
38350 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
38360 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f  ;.    int iNextO
38370 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ld = pOld->nCell
38380 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20   + nOverflow;.  
38390 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20    int iOverflow 
383a0 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70  = (nOverflow ? p
383b0 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 3a  Old->aiOvfl[0] :
383c0 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b   -1);.    j = 0;
383d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
383f0 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69  Current 'old' si
38400 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20  bling page */.  
38410 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20    k = 0;        
38420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38430 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
38440 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61  'new' sibling pa
38450 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ge */.    for(i=
38460 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCel