/ Hex Artifact Content
Login

Artifact 84c9a4a20b827a6f7dbcbcda59607dbee57af446:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4d10: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4d20: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4d30: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4d40: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4d50: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4d60: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
4d70: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
4d80: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
4d90: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4da0: 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
4db0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
4dc0: 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74 65  alid (has eState
4dd0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  ==CURSOR_VALID).
4de0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
4df0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
4e00: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
4e10: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
4e20: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
4e30: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
4e40: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
4e50: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
4e60: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
4e70: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
4e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
4e90: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
4ea0: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
4eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
4ec0: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
4ed0: 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  >nKey);.  assert
4ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4ef0: 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29  );  /* KeySize()
4f00: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
4f10: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
4f20: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
4f30: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
4f40: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
4f50: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
4f60: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
4f70: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
4f80: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
4f90: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
4fa0: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
4fb0: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
4fc0: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
4fd0: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
4fe0: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
4ff0: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
5000: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
5010: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
5020: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
5030: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
5040: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50  if( 0==pCur->apP
5050: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
5060: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
5070: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
5080: 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  ( (int)pCur->nKe
5090: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  y );.    if( pKe
50a0: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
50b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
50c0: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
50d0: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
50e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
50f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5100: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
5110: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
5120: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5130: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
5140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5150: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
5160: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5170: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5180: 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  !pCur->apPage[0]
5190: 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  ->intKey || !pCu
51a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
51b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
51c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
51d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
51e0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
51f0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
5200: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
5210: 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  i]);.      pCur-
5220: 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
5230: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
5240: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20  iPage = -1;.    
5250: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5260: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5270: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5280: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5290: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
52a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
52b0: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
52c0: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
52d0: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
52e0: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
52f0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
5300: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5310: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
5320: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
5330: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
5340: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
5350: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
5360: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
5370: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5380: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
5390: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
53a0: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
53b0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
53c0: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
53d0: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
53e0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
53f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5400: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
5420: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
5430: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
5440: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
5450: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5460: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
5470: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
5480: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
5490: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
54a0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
54b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
54c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
54d0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
54e0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
54f0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5500: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
5510: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
5520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5530: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5540: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
5550: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5560: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
5570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
5580: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
5590: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
55a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
55b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
55c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
55d0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
55e0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
55f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5600: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
5610: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
5620: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
5630: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
5640: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
5650: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
5660: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
5670: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
5680: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
5690: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
56a0: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
56b0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
56c0: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
56d0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
56e0: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
56f0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
5700: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
5710: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
5720: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
5730: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
5740: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
5750: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
5760: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5770: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5780: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5790: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
57a0: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
57b0: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
57c0: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
57d0: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
57e0: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
57f0: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
5800: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
5810: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
5820: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
5830: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5850: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
5860: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5870: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5880: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5890: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
58a0: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
58b0: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
58c0: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
58d0: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
58e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65   */.  char *pFre
58f0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b  e = 0;..  if( pK
5900: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5910: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5920: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5930: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5940: 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
5950: 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20  Record(.        
5960: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5970: 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
5980: 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20  Space), &pFree. 
5990: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49     );.    if( pI
59a0: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
59b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
59c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
59d0: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
59e0: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
59f0: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
5a00: 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xKey);.  }else{.
5a10: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
5a20: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5a30: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
5a40: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
5a50: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
5a60: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
5a70: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
5a80: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
5a90: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
5aa0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
5ab0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5ac0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5ad0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5ae0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5af0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5b00: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5b10: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5b20: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5b30: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
5b40: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
5b50: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
5b60: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
5b70: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
5b80: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
5b90: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5ba0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5bb0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5bc0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5bd0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5be0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5bf0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5c00: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5c10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5c20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5c30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5c40: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5c50: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5c60: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5c70: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5c80: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
5c90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5ca0: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5cb0: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5cc0: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5cd0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5ce0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5cf0: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5d00: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5d10: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5d20: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5d30: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5d40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5d60: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5d70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5d80: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5d90: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5da0: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5db0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5dc0: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5dd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5de0: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5df0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5e00: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5e10: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5e20: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5e30: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5e40: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5e50: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5e60: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5e70: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5e80: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5e90: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5ea0: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5eb0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5ec0: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5ed0: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5ee0: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5ef0: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5f00: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5f10: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5f20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5f30: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5f40: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5f50: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5f60: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5f70: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5f80: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5f90: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5fa0: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5fb0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5fc0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5fd0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5fe0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5ff0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
6000: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6010: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
6020: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
6030: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
6040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6050: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6060: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6070: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
6080: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
6090: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
60a0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
60b0: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
60c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
60d0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
60e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
60f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
6100: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
6110: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
6120: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
6130: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
6140: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
6150: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
6160: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
6170: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
6180: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
6190: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
61a0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
61b0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
61c0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
61d0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
61e0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
61f0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
6200: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
6210: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
6220: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
6230: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
6240: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
6250: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
6260: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
6270: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
6280: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
6290: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
62a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
62b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
62c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
62d0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
62e0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
62f0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6300: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6310: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6320: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6330: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
6340: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
6350: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
6360: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
6370: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
6380: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
6390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
63a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
63b0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
63c0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
63d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
63e0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
63f0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6400: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6410: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6420: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6430: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
6440: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6450: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
6460: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
6470: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
6480: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
6490: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
64a0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
64b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
64c0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
64d0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
64e0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
64f0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6500: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6510: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6520: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6530: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
6540: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
6550: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
6560: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6570: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
6580: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
6590: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
65a0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
65b0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
65c0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
65d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
65e0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
65f0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6600: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6610: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6630: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
6640: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
6650: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
6660: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
6670: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6680: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6690: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
66a0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
66b0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
66c0: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
66d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
66e0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
66f0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6700: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6710: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6720: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6730: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
6740: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
6750: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6760: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
6770: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
6780: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6790: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
67a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
67b0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
67c0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
67d0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
67e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
67f0: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6800: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6810: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6820: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6830: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
6840: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
6850: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6860: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6870: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6880: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6890: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
68a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
68b0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
68c0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
68d0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
68e0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
68f0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6900: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6910: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6920: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
6930: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
6940: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
6950: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
6960: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
6970: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
6980: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6990: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
69a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
69b0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
69c0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
69d0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
69e0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
69f0: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6a00: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6a10: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6a20: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
6a40: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
6a50: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
6a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6a70: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
6a80: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6a90: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6aa0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6ab0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6ac0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6ad0: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6ae0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6af0: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6b00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6b10: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6b20: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
6b30: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
6b40: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
6b50: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b60: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
6b70: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
6b80: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6b90: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6ba0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6bb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6bc0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6bd0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6be0: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6bf0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6c00: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6c10: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6c20: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
6c30: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
6c40: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
6c50: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
6c60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6c70: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6c80: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
6c90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6ca0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6cc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6cd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6ce0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6cf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6d00: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6d10: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6d20: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6d30: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
6d40: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6d50: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6d60: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6d70: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
6d80: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6d90: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
6da0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6db0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
6dc0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6dd0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6de0: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
6df0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
6e00: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
6e10: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
6e20: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
6e30: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
6e40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6e50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
6e60: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6e70: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
6e80: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
6e90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6ea0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
6eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ec0: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
6ed0: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
6ee0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
6ef0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f00: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
6f10: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f20: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6f30: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6f40: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6f50: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
6f60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
6f70: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
6f80: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
6f90: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
6fa0: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
6fb0: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
6fc0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6fd0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6fe0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6ff0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
7000: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
7010: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
7020: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
7030: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
7040: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
7050: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
7060: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
7070: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
7080: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
7090: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43  et2byte(&(P)->aC
70a0: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
70b0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
70c0: 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b  lv2(D,M,O,I) (D+
70d0: 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f  (M&get2byte(D+(O
70e0: 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a  +2*(I))))).../*.
70f0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
7100: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
7110: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
7120: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
7130: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
7140: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7150: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
7160: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
7170: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
7180: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
7190: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
71a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
71b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
71c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
71d0: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
71e0: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
71f0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
7200: 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69     k = pPage->ai
7210: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Ovfl[i];.    if(
7220: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
7230: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
7240: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7250: 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
7260: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
7270: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
7280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
7290: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
72a0: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
72b0: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
72c0: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
72d0: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
72e0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
72f0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
7300: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
7310: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65   function.  btre
7320: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
7330: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
7340: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
7350: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62  d argument and b
7360: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7370: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
7380: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
7390: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
73a0: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
73b0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
73c0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
73d0: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
73e0: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
73f0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
7400: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7410: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
7420: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
7430: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
7440: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7450: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7460: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
7470: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7480: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7490: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
74a0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
74b0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
74c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
74d0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
74e0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
74f0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7500: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7510: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
7520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7530: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
7540: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
7550: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
7560: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
7570: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7580: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
7590: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
75a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
75b0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
75c0: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
75d0: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
75e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
75f0: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
7600: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
7610: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
7620: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
7630: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
7640: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
7650: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
7660: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
7670: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
7680: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7690: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
76a0: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
76b0: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
76c0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
76d0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
76e0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
76f0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
7700: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7710: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7720: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
7730: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
7740: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7750: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7760: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
7770: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
7780: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
7790: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
77a0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
77b0: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73  eader = n;.  tes
77c0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
77d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
77e0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
77f0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
7800: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
7810: 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79   if( likely(nPay
7820: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
7830: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
7840: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
7850: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
7860: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
7870: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
7880: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
7890: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
78a0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
78b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
78c0: 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d   (pInfo->nSize =
78d0: 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61   (u16)(n+nPayloa
78e0: 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  d))<4 ) pInfo->n
78f0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
7900: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7910: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
7920: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7930: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
7940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
7950: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
7960: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
7970: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
7980: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
7990: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
79a0: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
79b0: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
79c0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
79d0: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
79e0: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
79f0: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
7a00: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
7a10: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
7a20: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
7a30: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
7a40: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
7a50: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
7a60: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
7a70: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
7a80: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
7a90: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
7aa0: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
7ab0: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
7ac0: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
7ad0: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
7ae0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
7af0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
7b00: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
7b10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
7b20: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
7b30: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
7b40: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b50: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7b60: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
7b70: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
7b80: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b90: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7ba0: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
7bb0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
7bc0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
7bd0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
7be0: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
7bf0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
7c00: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
7c10: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
7c20: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
7c30: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
7c40: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
7c50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7c60: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7c70: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7c80: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
7c90: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72     testcase( sur
7ca0: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
7cb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70   );.    if( surp
7cc0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
7cd0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
7ce0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
7cf0: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
7d00: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7d10: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
7d20: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
7d30: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d40: 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d  w = (u16)(pInfo-
7d50: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20  >nLocal + n);.  
7d60: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7d70: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d80: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
7d90: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
7da0: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
7db0: 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72  fo) \.  btreePar
7dc0: 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65  seCellPtr((pPage
7dd0: 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61  ), findCell((pPa
7de0: 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28  ge), (iCell)), (
7df0: 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76  pInfo)).static v
7e00: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7e10: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
7e20: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7e30: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7e40: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
7e50: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
7e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
7e70: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
7e80: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
7e90: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ea0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
7eb0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
7ec0: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
7ed0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
7ee0: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
7ef0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
7f00: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
7f10: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
7f20: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
7f30: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
7f40: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
7f50: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
7f60: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
7f70: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7f80: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
7f90: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
7fa0: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
7fb0: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
7fc0: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
7fd0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
7fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  ..*/.static u16 
7ff0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
8000: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8010: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
8020: 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61  ter = &pCell[pPa
8030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8040: 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  ];.  u32 nSize;.
8050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8060: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
8070: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
8080: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
8090: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
80a0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
80b0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
80c0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
80d0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
80e0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
80f0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
8100: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
8110: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
8120: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
8130: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
8140: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
8150: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
8160: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
8170: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
8180: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74   debuginfo;.  bt
8190: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
81a0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
81b0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
81c0: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
81d0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38  intKey ){.    u8
81e0: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20   *pEnd;.    if( 
81f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
8200: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d  {.      pIter +=
8210: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
8220: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20  er, nSize);.    
8230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
8240: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 0;.    }.. 
8250: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
8260: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
8270: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
8280: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
8290: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
82a0: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
82b0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
82c0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
82d0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
82e0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
82f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
8300: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
8310: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
8320: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
8330: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
8340: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
8350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8360: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8370: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8380: 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  ;.  }..  testcas
8390: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
83a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
83b0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
83c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
83d0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
83e0: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
83f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   ){.    int minL
8400: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8410: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
8420: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
8430: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
8440: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
8450: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
8460: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8470: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8480: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
8490: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
84a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
84b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
84c0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
84d0: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
84e0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
84f0: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
8500: 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b  4;.  }.  nSize +
8510: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
8520: 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68  pCell);..  /* Th
8530: 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
8540: 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20  f any cell is 4 
8550: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20  bytes. */.  if( 
8560: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e  nSize<4 ){.    n
8570: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  Size = 4;.  }.. 
8580: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
8590: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
85a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
85b0: 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65  )nSize;.}..#ifde
85c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
85d0: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
85e0: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
85f0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
8600: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
8610: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
8620: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
8630: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
8640: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
8650: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
8660: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
8670: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8680: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
8690: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
86a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
86b0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
86c0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
86d0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
86e0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
86f0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
8700: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
8710: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
8720: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
8730: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
8740: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
8750: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8760: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
8770: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
8780: 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  l, int *pRC){.  
8790: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
87a0: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
87b0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rn;.  assert( pC
87c0: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65  ell!=0 );.  btre
87d0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
87e0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
87f0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
8800: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
8810: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
8820: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
8830: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
8840: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
8850: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
8860: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
8870: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
8880: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
8890: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
88a0: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
88b0: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
88c0: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
88d0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
88e0: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
88f0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
8900: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
8910: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
8920: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
8930: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
8940: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8950: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8960: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8970: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
8980: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
8990: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
89a0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
89b0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
89c0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
89d0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
89e0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8a10: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8a40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8a50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8a70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
8a80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
8a90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
8aa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8ab0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
8ac0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
8ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8ae0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
8af0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
8b00: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
8b10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8b20: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
8b30: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
8b40: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8b70: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8b80: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
8b90: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
8ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8bb0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
8bc0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
8bd0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8be0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8bf0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8c00: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8c10: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8c20: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8c30: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8c40: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8c50: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8c60: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
8c80: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
8c90: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
8ca0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
8cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8cc0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8cd0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8ce0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8cf0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8d10: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8d20: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8d30: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8d40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8d50: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8d60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8d70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8d80: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8d90: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
8da0: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
8db0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
8dc0: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
8dd0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8de0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8df0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8e00: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8e10: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8e20: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8e30: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8e40: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8e50: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8e60: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8e70: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8e80: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
8e90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8ea0: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
8eb0: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
8ec0: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
8ed0: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
8ee0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
8ef0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
8f00: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
8f10: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
8f20: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
8f30: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
8f40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8f50: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8f60: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8f70: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8f80: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
8f90: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
8fa0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
8fb0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
8fc0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8fd0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8fe0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8ff0: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
9000: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9010: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9020: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
9030: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
9040: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9050: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
9060: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
9070: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
9080: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9090: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
90a0: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
90b0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
90c0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
90d0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
90e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
90f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9100: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
9110: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
9120: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
9130: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
9140: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9150: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
9160: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
9170: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9180: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9190: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
91a0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
91b0: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
91c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91e0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
91f0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
9200: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
9210: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9230: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9240: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
9250: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
9260: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
9270: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
9280: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9290: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
92a0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
92b0: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
92c0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
92d0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
92e0: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
92f0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
9300: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
9310: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
9320: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
9330: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
9340: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
9350: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
9360: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
9370: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
9380: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
9390: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
93a0: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
93b0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
93c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93d0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93e0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93f0: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
9400: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
9410: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
9420: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9430: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
9440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9450: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
9460: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
9470: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
9480: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
9490: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
94a0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
94b0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
94c0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
94d0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
94e0: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
94f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
9500: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
9510: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
9520: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
9530: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
9540: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
9550: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
9560: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
9570: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
9580: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9590: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
95a0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
95b0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
95c0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
95d0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
95e0: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
95f0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
9600: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
9610: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
9620: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
9630: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
9640: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
9650: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
9660: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
9670: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
9680: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
9690: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
96a0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
96b0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
96c0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
96d0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
96e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
96f0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
9700: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9710: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
9720: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
9730: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
9740: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
9750: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
9760: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
9770: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
9780: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9790: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
97a0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
97b0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
97c0: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
97f0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
9800: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
9810: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9840: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
9850: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
9860: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
9870: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
9880: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
9890: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
98a0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
98b0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
98c0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
98d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
98e0: 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
98f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
9900: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
9910: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9920: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9930: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
9940: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9950: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9970: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9980: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9990: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
99a0: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
99b0: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
99c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
99d0: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
99e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
99f0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
9a00: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
9a10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9a20: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
9a30: 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a  Byte < usableSiz
9a40: 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20  e-8 );..  nFrag 
9a50: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
9a60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a70: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
9a80: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
9a90: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
9aa0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9ab0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
9ac0: 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65  Cell;.  top = ge
9ad0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9ae0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
9af0: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
9b00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9b10: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
9b20: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
9b30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9b40: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
9b50: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9b60: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9b70: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9b80: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9b90: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9ba0: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9bb0: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9bc0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9bd0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9be0: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9bf0: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9c00: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c10: 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c  }else if( gap+2<
9c20: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =top ){.    /* S
9c30: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
9c40: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9c50: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9c60: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9c70: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
9c80: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
9c90: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
9ca0: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
9cb0: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
9cc0: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
9cd0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
9ce0: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
9cf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
9d00: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
9d10: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
9d20: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
9d30: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
9d40: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
9d50: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
9d60: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9d70: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
9d80: 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62       if( pc>usab
9d90: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61  leSize-4 || pc<a
9da0: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  ddr+4 ){.       
9db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9dc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9dd0: 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20     }.      size 
9de0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9df0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
9e00: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
9e10: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
9e20: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
9e30: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9e40: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
9e50: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
9e60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9e70: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x<4 ){.         
9e80: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
9e90: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
9ea0: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
9eb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
9ec0: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
9ed0: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
9ee0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
9ef0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
9f00: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61  &data[addr], &da
9f10: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
9f20: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
9f30: 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b  ] = (u8)(nFrag +
9f40: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   x);.        }el
9f50: 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e  se if( size+pc >
9f60: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
9f70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9f80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9f90: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
9fa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
9fb0: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
9fc0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
9fd0: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
9fe0: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
9ff0: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
a000: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
a010: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
a020: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
a030: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a040: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
a050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a060: 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b   *pIdx = pc + x;
a070: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
a090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a0a0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
a0b0: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65   sure there is e
a0c0: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74  nough space in t
a0d0: 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66  he gap to satisf
a0e0: 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63  y.  ** the alloc
a0f0: 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20  ation.  If not, 
a100: 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f  defragment..  */
a110: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a120: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
a130: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
a140: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63  te>top ){.    rc
a150: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
a160: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
a170: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a180: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a190: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
a1a0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
a1b0: 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65  ssert( gap+nByte
a1c0: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
a1d0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
a1e0: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
a1f0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a200: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a210: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
a220: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a230: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
a240: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
a250: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
a260: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
a270: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
a280: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
a290: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
a2a0: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
a2b0: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
a2c0: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
a2d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a2e0: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
a2f0: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
a300: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
a310: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
a320: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
a330: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
a340: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
a360: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
a370: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a380: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
a390: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
a3a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a3b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
a3c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
a3d0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
a3e0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
a3f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a400: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
a410: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
a420: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
a430: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a440: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
a450: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
a460: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
a470: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
a480: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
a490: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
a4a0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
a4b0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
a4c0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
a4d0: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
a4e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a4f0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
a500: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
a510: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74  egin, hdr;.  int
a520: 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a540: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
a550: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
a560: 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  set */.  unsigne
a570: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
a580: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
a590: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a5a0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
a5b0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a5c0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a5d0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a5e0: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
a5f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
a600: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
a610: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
a620: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
a630: 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  ) <= (int)pPage-
a640: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a660: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a670: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a680: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a690: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
a6a0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
a6b0: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66  ze is 4 */..  if
a6c0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
a6d0: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
a6e0: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
a6f0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
a700: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
a710: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
a720: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
a730: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
a740: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
a750: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
a760: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a770: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
a780: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
a790: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
a7a0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
a7b0: 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  cks.  Note that.
a7c0: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
a7d0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
a7e0: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
a7f0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
a800: 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e  (),.  ** btreeIn
a810: 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74  itPage() did not
a820: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70   detect overlapp
a830: 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a  ing cells or.  *
a840: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  * freeblocks tha
a850: 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c  t overlapped cel
a860: 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69  ls.   Nor does i
a870: 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  t detect when th
a880: 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74  e.  ** cell cont
a890: 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73  ent area exceeds
a8a0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a8b0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
a8c0: 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69  If these.  ** si
a8d0: 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20  tuations arise, 
a8e0: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
a8f0: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
a900: 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a  s might corrupt.
a910: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a920: 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65  t.  So we do nee
a930: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63  d to check for c
a940: 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20  orruption while 
a950: 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68  scanning.  ** th
a960: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
a970: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
a980: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
a990: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
a9a0: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
a9b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
a9c0: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  4;.  assert( sta
a9d0: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77  rt<=iLast );.  w
a9e0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
a9f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
aa00: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
aa10: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
aa20: 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b  if( pbegin<addr+
aa30: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
aa40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
aa50: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
aa60: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
aa70: 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e    }.  if( pbegin
aa80: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
aa90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
aaa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
aab0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
aac0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
aad0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
aae0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
aaf0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
ab00: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
ab10: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
ab20: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
ab30: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
ab40: 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
ab50: 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a  nFree + (u16)siz
ab60: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
ab70: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
ab80: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
ab90: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
aba0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
abb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
abc0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
abd0: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
abe0: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
abf0: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
ac00: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
ac10: 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  n <= (int)pPage-
ac20: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ac30: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
ac40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ac50: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
ac60: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ac70: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ac80: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
ac90: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
aca0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
acb0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
acc0: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
acd0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
ace0: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
acf0: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
ad00: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
ad10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ad20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ad30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
ad50: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
ad60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ad70: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
ad80: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ad90: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
ada0: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
adb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
adc0: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
add0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
ade0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
adf0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
ae00: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
ae10: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
ae20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
ae30: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
ae40: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
ae50: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
ae60: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
ae70: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
ae80: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
ae90: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
aea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
aeb0: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
aec0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
aed0: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
aee0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
aef0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
af00: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
af10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
af20: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
af30: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
af40: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
af50: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
af60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
af70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
af80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
af90: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
afa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
afb0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
afc0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
afd0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
afe0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aff0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
b000: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
b010: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
b020: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
b030: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
b040: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
b050: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
b060: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
b070: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
b080: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
b090: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
b0a0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
b0b0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
b0c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
b0d0: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
b0e0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
b0f0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b100: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
b110: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b120: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
b130: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
b140: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
b150: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
b160: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
b170: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b180: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
b190: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
b1a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b1b0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
b1c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b1d0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
b1e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b1f0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b200: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b210: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b220: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
b230: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
b240: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
b250: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
b260: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
b270: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b280: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
b290: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
b2a0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
b2b0: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
b2c0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b2d0: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
b2e0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
b2f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b300: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
b310: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b320: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
b330: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b340: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b350: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
b360: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
b370: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
b380: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b390: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
b3a0: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
b3b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b3c0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
b3d0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b3e0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
b3f0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
b400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b410: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b420: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
b430: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
b440: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b450: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
b460: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b470: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b480: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b490: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b4a0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
b4b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
b4c0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
b4d0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
b4e0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
b4f0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
b500: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
b510: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
b520: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
b530: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
b540: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
b550: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
b560: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
b570: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
b580: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
b590: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
b5a0: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
b5b0: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
b5c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
b5d0: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
b5e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
b5f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b600: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
b610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b620: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b630: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b640: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b650: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
b660: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
b670: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b680: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b690: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b6a0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
b6b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b6c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
b6d0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
b6e0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
b6f0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
b700: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
b710: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
b720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b730: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
b740: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
b750: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
b760: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
b770: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b780: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
b790: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
b7a0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
b7b0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
b7c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
b7d0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
b7e0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
b7f0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
b800: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
b810: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
b820: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
b830: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
b840: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
b850: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
b860: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
b870: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
b880: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
b890: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
b8a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
b8b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
b8c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
b8d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
b8e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
b8f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
b900: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
b910: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
b920: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
b930: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
b940: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
b950: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
b960: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
b970: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
b980: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
b990: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
b9a0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
b9b0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
b9c0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b9d0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
b9e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b9f0: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
ba00: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
ba10: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
ba20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ba30: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
ba40: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
ba50: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
ba60: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
ba70: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
ba80: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
ba90: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
baa0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
bab0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
bac0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
bad0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
bae0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
baf0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
bb00: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
bb10: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
bb20: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
bb30: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
bb40: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
bb50: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
bb60: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
bb70: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
bb80: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
bb90: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
bba0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
bbb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
bbc0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
bbd0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
bbe0: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
bbf0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
bc00: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
bc10: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
bc20: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
bc30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bc50: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
bc60: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
bc70: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
bc80: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
bc90: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
bca0: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
bcb0: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
bcc0: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
bcd0: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
bce0: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
bcf0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
bd00: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
bd10: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
bd20: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
bd30: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
bd40: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
bd50: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
bd60: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
bd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
bd80: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
bd90: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
bda0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
bdb0: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
bdc0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
bdd0: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
bde0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
bdf0: 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65   - 4;.#if define
be00: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
be10: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
be20: 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ECK).    {.     
be30: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
be40: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
be50: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
be60: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
be70: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
be80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
be90: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
bea0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
beb0: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
bec0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bed0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
bee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
bef0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bf00: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
bf10: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bf20: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
bf30: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
bf40: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
bf50: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
bf60: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bf70: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bf80: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
bf90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bfa0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
bfc0: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
bfd0: 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
bfe0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bff0: 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
c000: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
c010: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
c020: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c040: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c060: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
c070: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
c080: 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23  ast++;.    }  .#
c090: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
c0a0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
c0b0: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
c0c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
c0d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c0e0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
c0f0: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
c100: 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68  7] + top;.    wh
c110: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
c120: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
c130: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
c140: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c150: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c160: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
c170: 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  f free block is 
c180: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
c190: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c1a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c1b0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c1c0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
c1d0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
c1e0: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
c1f0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
c200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
c210: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
c220: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
c230: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c240: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
c250: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c260: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
c270: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
c280: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
c290: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
c2a0: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
c2b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
c2c0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
c2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c2e0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c2f0: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
c300: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
c310: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
c320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c330: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
c340: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
c350: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
c360: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
c370: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
c380: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
c390: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
c3a0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
c3b0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
c3c0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c3d0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
c3e0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
c3f0: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
c400: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
c410: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
c420: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
c430: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
c440: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
c450: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
c460: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c470: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
c480: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
c490: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
c4a0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
c4b0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
c4c0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
c4d0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
c4e0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c500: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c510: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
c520: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
c530: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
c540: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
c550: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
c560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c570: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
c580: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
c590: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
c5a0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
c5b0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
c5c0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
c5d0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
c5e0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
c5f0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
c600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c610: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c620: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
c630: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
c640: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
c650: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
c660: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
c670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c680: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
c690: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
c6a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
c6b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c6c0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
c6d0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
c6e0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
c6f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c700: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c710: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
c720: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
c730: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c740: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
c750: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
c760: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c770: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
c780: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
c790: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
c7a0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
c7b0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
c7c0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
c7d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c7e0: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
c7f0: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
c800: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
c810: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
c820: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
c830: 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65  0 ?1:0);.  memse
c840: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
c850: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
c860: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
c870: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c880: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
c890: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
c8a0: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
c8b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
c8c0: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
c8d0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
c8e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
c8f0: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
c900: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c910: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
c920: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
c930: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
c940: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
c950: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
c960: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
c970: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
c980: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
c990: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
c9a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
c9b0: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
c9c0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
c9d0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
c9e0: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
c9f0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
ca00: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
ca10: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
ca20: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
ca30: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
ca40: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
ca50: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
ca60: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
ca70: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
ca80: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
ca90: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
caa0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
cab0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
cac0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
cad0: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
cae0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
caf0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
cb00: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
cb10: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
cb20: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
cb30: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
cb40: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
cb50: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
cb60: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
cb70: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
cb80: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
cb90: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
cba0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
cbb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
cbc0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
cbd0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
cbe0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cbf0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cc00: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cc10: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
cc20: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
cc30: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
cc40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
cc50: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
cc60: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
cc70: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
cc80: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
cc90: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
cca0: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
ccb0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
ccc0: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
ccd0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
cce0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
ccf0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
cd00: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
cd10: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
cd20: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
cd30: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
cd40: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
cd50: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
cd60: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
cd70: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
cd80: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
cd90: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
cda0: 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
cdb0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
cdc0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
cdd0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
cde0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
cdf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
ce00: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
ce10: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
ce20: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
ce30: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
ce40: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
ce50: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
ce60: 2c 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  ,       /* Do no
ce70: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
ce80: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ent if true */. 
ce90: 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20   int bReadonly  
cea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
ceb0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
cec0: 61 70 29 20 70 61 67 65 20 69 73 20 6f 6b 20 2a  ap) page is ok *
ced0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
cee0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
cef0: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
cf00: 28 6e 6f 43 6f 6e 74 65 6e 74 20 3f 20 50 41 47  (noContent ? PAG
cf10: 45 52 5f 41 43 51 55 49 52 45 5f 4e 4f 43 4f 4e  ER_ACQUIRE_NOCON
cf20: 54 45 4e 54 20 3a 20 30 29 20 0a 20 20 20 20 20  TENT : 0) .     
cf30: 20 20 20 20 20 20 20 7c 20 28 62 52 65 61 64 6f         | (bReado
cf40: 6e 6c 79 20 3f 20 50 41 47 45 52 5f 41 43 51 55  nly ? PAGER_ACQU
cf50: 49 52 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  IRE_READONLY : 0
cf60: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 6f  );..  assert( no
cf70: 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 52  Content==0 || bR
cf80: 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadonly==0 );.  
cf90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cfa0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cfb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
cfc0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
cfd0: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
cfe0: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
cff0: 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
d000: 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
d010: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
d020: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
d030: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
d040: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
d050: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d060: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
d070: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
d080: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d090: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
d0a0: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
d0b0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
d0c0: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
d0d0: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
d0e0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
d0f0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
d100: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
d110: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
d120: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
d130: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
d140: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
d150: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
d160: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
d170: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d180: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d190: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
d1a0: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
d1b0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
d1c0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
d1d0: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
d1e0: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
d1f0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
d200: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
d210: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d220: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
d230: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
d240: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d250: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
d260: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
d270: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
d280: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
d290: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
d2a0: 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
d2b0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
d2c0: 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
d2d0: 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
d2e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
d2f0: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
d300: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d310: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
d320: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
d330: 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
d340: 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
d350: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   );.  return (in
d360: 74 29 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  t)btreePagecount
d370: 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
d380: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
d390: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
d3a0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
d3b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d3c0: 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
d3d0: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
d3e0: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
d3f0: 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
d400: 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
d410: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
d420: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d430: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
d440: 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
d450: 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
d460: 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
d470: 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
d480: 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
d490: 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
d4a0: 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
d4b0: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
d4c0: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
d4d0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d4f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d500: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d530: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
d540: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
d550: 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
d560: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d570: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
d580: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62   here */.  int b
d590: 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20  Readonly        
d5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d5b0: 75 65 20 69 66 20 61 20 72 65 61 64 2d 6f 6e 6c  ue if a read-onl
d5c0: 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 69 73  y (mmap) page is
d5d0: 20 6f 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   ok */.){.  int 
d5e0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d5f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d600: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d610: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d620: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d630: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d640: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d660: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d670: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d680: 65 2c 20 30 2c 20 62 52 65 61 64 6f 6e 6c 79 29  e, 0, bReadonly)
d690: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
d6a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d6b0: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
d6c0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
d6d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d6e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d6f0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
d700: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
d710: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
d720: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
d730: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
d740: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
d750: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
d760: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d770: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
d780: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
d790: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
d7a0: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
d7b0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
d7c0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
d7d0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
d7e0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
d7f0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
d800: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d810: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d820: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d830: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
d840: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d850: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
d860: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
d870: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
d880: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d890: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
d8a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
d8b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
d8c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d8d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
d8e0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
d8f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
d900: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
d910: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
d920: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
d930: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
d940: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
d950: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
d960: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
d970: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
d980: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
d990: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
d9a0: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
d9b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
d9c0: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
d9d0: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
d9e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d9f0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
da00: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
da10: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
da20: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
da30: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
da40: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
da50: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
da60: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
da70: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
da80: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
da90: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
daa0: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
dab0: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
dac0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
dad0: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
dae0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
daf0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
db00: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
db10: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
db20: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
db30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
db40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
db50: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
db60: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
db70: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
db80: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
db90: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
dba0: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
dbb0: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
dbc0: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
dbd0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
dbe0: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
dbf0: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
dc00: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
dc10: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
dc20: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
dc30: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
dc40: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
dc50: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
dc60: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
dc70: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
dc80: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
dc90: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
dca0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
dcb0: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
dcc0: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
dcd0: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
dce0: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
dcf0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
dd00: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
dd10: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
dd20: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
dd30: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
dd40: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
dd50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
dd60: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
dd70: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
dd80: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
dd90: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
dda0: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
ddb0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
ddc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
ddd0: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
dde0: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
ddf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
de00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
de10: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
de20: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
de30: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
de40: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
de50: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
de60: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
de70: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
de80: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
de90: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
dea0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
deb0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
dec0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
ded0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
dee0: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
def0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
df00: 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
df10: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
df20: 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
df30: 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
df40: 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
df50: 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
df60: 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
df70: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
df80: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
df90: 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
dfa0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
dfb0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
dfc0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
dfd0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
dfe0: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
dff0: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
e000: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
e010: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
e020: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
e030: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
e040: 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
e050: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
e060: 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
e070: 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
e080: 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
e090: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
e0a0: 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
e0b0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
e0c0: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
e0d0: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
e0e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e0f0: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
e100: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
e110: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
e120: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
e130: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
e140: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
e150: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
e160: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
e170: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
e180: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
e190: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
e1a0: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
e1b0: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
e1c0: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
e1d0: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
e1e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e1f0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
e200: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
e210: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
e220: 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
e230: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e240: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
e250: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
e260: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
e270: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
e280: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
e290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
e2a0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
e2b0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
e2c0: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
e2d0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
e2e0: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
e2f0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
e300: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e320: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
e330: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
e340: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
e350: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
e360: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
e370: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
e380: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
e390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e3a0: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
e3b0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e3c0: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
e3f0: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
e400: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
e410: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
e420: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
e430: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
e440: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
e450: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e460: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
e470: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
e480: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
e490: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e4b0: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
e4c0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
e4d0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
e4e0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
e4f0: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
e500: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
e510: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
e520: 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
e530: 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
e540: 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
e550: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
e560: 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
e570: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
e580: 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
e590: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
e5a0: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
e5b0: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
e5c0: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
e5d0: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
e5e0: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
e5f0: 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
e600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e610: 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
e620: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
e630: 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
e640: 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
e650: 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
e660: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
e670: 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
e6a0: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
e6b0: 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
e6e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
e6f0: 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
e700: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
e710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
e720: 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
e730: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e740: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
e750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
e760: 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
e770: 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
e780: 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
e790: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
e7a0: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e7b0: 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
e7c0: 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
e7d0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
e7e0: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e7f0: 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
e800: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
e810: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
e820: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
e830: 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
e840: 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
e850: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
e860: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
e870: 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
e880: 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
e890: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
e8a0: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
e8b0: 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
e8c0: 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
e8d0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
e8e0: 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
e8f0: 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
e900: 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
e910: 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
e920: 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
e930: 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
e940: 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
e950: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
e960: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
e970: 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
e980: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
e990: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e9a0: 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
e9b0: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
e9c0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
e9d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e9e0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
e9f0: 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
ea00: 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
ea10: 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
ea20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ea30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ea40: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
ea50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ea60: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
ea70: 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
ea80: 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
ea90: 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
eaa0: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
eab0: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
eac0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
ead0: 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
eae0: 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
eaf0: 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
eb00: 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
eb10: 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
eb20: 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
eb30: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
eb40: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
eb50: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
eb60: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
eb70: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
eb80: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
eb90: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
eba0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
ebb0: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
ebc0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
ebd0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
ebe0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
ebf0: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
ec00: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
ec10: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
ec20: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
ec30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ec40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ec50: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ec60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ec70: 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
ec80: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
ec90: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
eca0: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  name, sqlite3Str
ecb0: 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
ecc0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
ecd0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ece0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ecf0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
ed00: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed20: 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61           nFullPa
ed30: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
ed40: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
ed50: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ed60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ed70: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
ed80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ed90: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
eda0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
edb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
edc0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
edd0: 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d  READSAFE.      m
ede0: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
edf0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
ee00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
ee10: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
ee20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ee30: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
ee40: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
ee50: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ee60: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ee70: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
ee80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ee90: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
eea0: 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a  Shared);.#endif.
eeb0: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
eec0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
eed0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
eee0: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
eef0: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
ef00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
ef10: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
ef20: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
ef30: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
ef40: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
ef50: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
ef60: 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  er, 0)).        
ef70: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
ef80: 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
ef90: 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
efa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
efb0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
efc0: 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
efd0: 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
efe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
eff0: 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
f000: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
f010: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
f020: 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
f030: 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
f040: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
f050: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f060: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
f070: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
f080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f090: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
f0a0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
f0b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f0c0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f0e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
f100: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
f110: 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
f120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f130: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
f140: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
f150: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
f160: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f170: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f180: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f190: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f1a0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f1b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
f1c0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f1d0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
f1e0: 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
f1f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
f200: 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
f210: 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
f220: 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
f230: 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
f240: 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
f250: 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
f260: 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
f270: 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
f280: 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
f290: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
f2a0: 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
f2b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
f2c0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
f2d0: 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
f2e0: 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
f2f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
f300: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
f310: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
f320: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
f330: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
f340: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f350: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
f360: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
f370: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
f380: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
f390: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
f3a0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
f3b0: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
f3c0: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
f3d0: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
f3e0: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
f3f0: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
f400: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
f410: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f420: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
f430: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
f440: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f450: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
f460: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
f470: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f480: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
f490: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
f4a0: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
f4b0: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
f4c0: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
f4d0: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
f4e0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
f4f0: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
f500: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
f510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
f520: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
f530: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f540: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
f550: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
f560: 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
f570: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
f5a0: 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
f5b0: 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
f5c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f5d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f5e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f5f0: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
f600: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
f610: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
f620: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
f630: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f640: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
f650: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
f660: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
f670: 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
f680: 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
f690: 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
f6a0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
f6b0: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
f6c0: 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
f6d0: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
f6e0: 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
f6f0: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
f700: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
f710: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
f720: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
f730: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
f740: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
f750: 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
f760: 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
f770: 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
f780: 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
f790: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
f7a0: 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
f7b0: 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
f7c0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f7d0: 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
f7e0: 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
f7f0: 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
f800: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
f810: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
f820: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
f830: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
f840: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
f850: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
f860: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
f870: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
f880: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
f890: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f8a0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
f8b0: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
f8c0: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
f8d0: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
f8e0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f8f0: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
f900: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
f910: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
f920: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
f930: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
f940: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
f950: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
f960: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
f970: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
f980: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
f990: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
f9a0: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
f9b0: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
f9c0: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
f9d0: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
f9e0: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
f9f0: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
fa00: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
fa10: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
fa20: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
fa30: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
fa40: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
fa50: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
fa60: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
fa70: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
fa80: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
fa90: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
faa0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
fab0: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
fac0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
fad0: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
fae0: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
faf0: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
fb00: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
fb10: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
fb20: 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
fb30: 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
fb40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fb50: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
fb60: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
fb70: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
fb80: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
fb90: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
fba0: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
fbb0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
fbc0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
fbd0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
fbe0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
fbf0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
fc00: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
fc10: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
fc20: 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
fc30: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
fc40: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
fc50: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
fc60: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
fc70: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
fc80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
fc90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
fca0: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
fcb0: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
fcc0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
fcd0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
fce0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
fcf0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
fd00: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
fd10: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
fd20: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
fd30: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
fd40: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
fd50: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
fd60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fd70: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
fd80: 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
fd90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
fda0: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
fdb0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
fdc0: 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
fdd0: 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
fde0: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
fdf0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
fe00: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
fe10: 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
fe20: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
fe30: 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
fe40: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
fe50: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
fe60: 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
fe70: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
fe80: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
fe90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
fea0: 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
feb0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
fec0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
fed0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
fee0: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
fef0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
ff00: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
ff10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ff20: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ff30: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
ff40: 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
ff50: 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
ff60: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ff70: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ff80: 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
ff90: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ffa0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ffb0: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
ffc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ffd0: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
ffe0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
fff0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10000 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10010 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
10020 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10030 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
10040 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
10050 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
10060 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
10070 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
10080 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
10090 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
100a0 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
100b0 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
100c0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
100d0 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
100e0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
100f0 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
10100 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
10110 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
10120 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
10130 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
10140 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10150 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
10160 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
10170 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
10180 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
10190 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
101a0 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
101b0 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
101c0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
101d0 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
101e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
101f0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
10200 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
10210 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
10220 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
10230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10240 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
10250 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
10260 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
10270 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
10280 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
10290 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
102a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
102b0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
102c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
102d0 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
102e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
102f0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
10300 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
10310 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
10320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10330 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
10340 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
10350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10360 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
10370 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
10380 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
10390 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
103a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
103b0 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
103c0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
103d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
103e0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
103f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10400 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
10410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10420 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
10430 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
10440 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
10450 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
10460 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
10470 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
10480 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
10490 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
104a0 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
104b0 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
104c0 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
104d0 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
104e0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
104f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
10500 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
10510 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
10520 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
10530 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10540 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
10550 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
10560 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
10570 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
10580 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10590 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
105a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
105c0 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
105d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
105e0 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
105f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10600 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
10610 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
10620 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
10630 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
10640 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
10650 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
10660 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
10670 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
10680 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
10690 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
106a0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
106b0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
106c0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
106d0 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
106e0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
106f0 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
10700 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
10710 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
10720 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10730 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
10740 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
10750 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
10760 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
10770 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
10780 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
10790 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
107a0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
107b0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
107c0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
107d0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
107e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
107f0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
10800 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
10810 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
10820 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
10830 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
10840 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
10850 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10860 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10870 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
10880 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
10890 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
108a0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
108b0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
108c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
108d0 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
108e0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
108f0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
10900 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
10910 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
10920 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
10930 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
10940 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
10950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10960 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
10970 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
10980 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
10990 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
109a0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
109b0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
109d0 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
109e0 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
109f0 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
10a00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10a10 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
10a20 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
10a30 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
10a40 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
10a50 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
10a60 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
10a70 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
10a80 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
10a90 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
10aa0 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
10ab0 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
10ac0 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
10ad0 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
10ae0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
10af0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
10b00 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
10b10 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
10b20 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  eSize );.  }.}..
10b30 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
10b40 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
10b50 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
10b60 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
10b70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
10b80 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
10b90 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
10ba0 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
10bb0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
10bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10bd0 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
10be0 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
10bf0 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
10c00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
10c10 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
10c20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
10c30 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
10c40 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
10c50 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
10c60 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
10c70 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
10c80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10c90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
10ca0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
10cb0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10cc0 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
10cd0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
10ce0 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
10cf0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
10d00 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
10d10 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
10d20 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
10d30 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
10d40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
10d50 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
10d60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10d70 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
10d80 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
10d90 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
10da0 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
10db0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
10dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
10dd0 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
10de0 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
10df0 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
10e00 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
10e10 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
10e20 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
10e30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10e40 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
10e50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
10e60 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
10e70 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
10e80 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
10e90 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
10ea0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
10eb0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
10ec0 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
10ed0 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
10ee0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10ef0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
10f00 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
10f10 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
10f20 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
10f30 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
10f40 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
10f50 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
10f60 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
10f70 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
10f80 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
10f90 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
10fa0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
10fb0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
10fc0 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
10fd0 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
10fe0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
10ff0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
11000 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11010 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
11020 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
11030 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
11040 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
11050 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
11060 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
11070 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
11080 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
11090 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
110a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
110b0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
110c0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
110d0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
110e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
110f0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
11100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11110 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
11120 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
11130 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
11140 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
11150 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
11160 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
11170 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
11180 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
11190 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
111a0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
111b0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
111c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
111d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
111e0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
111f0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
11200 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
11210 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
11220 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
11230 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
11240 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
11250 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
11260 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
11270 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
11280 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
11290 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
112a0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
112b0 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
112c0 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
112d0 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
112e0 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
112f0 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
11300 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
11310 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
11320 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
11330 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
11340 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
11350 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
11360 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
11370 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
11380 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
11390 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
113a0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
113b0 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
113c0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
113d0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
113e0 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
113f0 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
11400 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
11410 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
11420 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
11430 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
11440 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
11450 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
11460 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
11470 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
11480 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
11490 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
114a0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
114b0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
114c0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
114d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
114e0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
114f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11500 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11510 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11520 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
11530 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
11540 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11550 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
11560 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11570 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11580 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11590 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
115a0 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
115b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
115c0 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
115d0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
115e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
115f0 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
11600 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c  it(Btree *p, sql
11610 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61  ite3_int64 mxMma
11620 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
11630 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11650 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
11660 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11670 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11680 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11690 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
116a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 4d 6d  Bt->pPager, mxMm
116b0 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
116c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
116d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
116e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
116f0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
11700 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
11710 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
11720 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
11730 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
11740 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
11750 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
11760 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
11770 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
11780 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
11790 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
117a0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
117b0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
117c0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
117d0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
117e0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
117f0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
11800 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
11810 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
11820 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
11830 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
11840 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11850 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11860 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11870 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
11880 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
11890 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
118a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
118b0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
118c0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
118d0 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
118e0 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  el(.  Btree *p, 
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11900 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
11910 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
11920 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  l on */.  int le
11930 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
11940 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
11950 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
11960 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
11970 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79   */.  int fullSy
11980 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nc,          /* 
11990 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
119a0 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46  . */.  int ckptF
119b0 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a  ullSync       /*
119c0 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
119d0 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29  nt_fullfync */.)
119e0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
119f0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11a00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11a10 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11a20 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11a30 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
11a40 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71  level<=3 );.  sq
11a50 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11a60 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11a70 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
11a80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
11a90 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63  vel, fullSync, c
11aa0 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  kptFullSync);.  
11ab0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11ac0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
11ae0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
11af0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
11b00 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
11b10 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
11b20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
11b30 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
11b40 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
11b50 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
11b60 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
11b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
11b80 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
11b90 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
11ba0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11bb0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
11bc0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11bd0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11be0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
11bf0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11c00 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
11c10 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
11c20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11c30 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
11c40 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
11c50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11c60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11c70 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11c80 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
11c90 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
11ca0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
11cb0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
11cc0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
11cd0 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
11ce0 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
11cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
11d00 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
11d10 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
11d20 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
11d30 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
11d40 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
11d50 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
11d60 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
11d70 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
11d80 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
11d90 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
11da0 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
11db0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
11dc0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
11dd0 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
11de0 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
11df0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
11e00 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
11e10 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
11e20 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
11e30 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
11e40 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
11e50 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
11e60 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
11e70 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
11e80 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
11e90 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
11ea0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
11eb0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
11ec0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
11ed0 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
11ee0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
11ef0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
11f00 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
11f10 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
11f20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
11f30 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
11f40 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
11f50 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
11f60 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
11f70 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
11f80 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
11f90 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
11fa0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
11fb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11fc0 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
11fd0 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
11fe0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
11ff0 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
12000 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12010 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
12020 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
12030 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
12040 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
12050 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
12060 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12070 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
12080 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
12090 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
120a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
120b0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
120c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
120d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
120e0 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
120f0 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
12100 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
12110 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
12120 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
12130 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
12140 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
12150 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
12160 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
12170 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
12180 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
12190 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
121a0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
121b0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
121c0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
121d0 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
121e0 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
121f0 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
12200 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
12210 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
12220 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
12230 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
12240 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
12250 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
12260 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
12270 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
12280 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
12290 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
122a0 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
122b0 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
122c0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
122d0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
122e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
122f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12300 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
12310 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
12320 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
12330 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
12340 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
12350 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
12360 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
12370 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  pageSize;.}..#if
12380 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12390 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65  HAS_CODEC) || de
123a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
123b0 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  UG)./*.** This f
123c0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
123d0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
123e0 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
123f0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
12400 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
12410 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
12420 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
12430 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
12440 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
12450 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
12460 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
12470 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
12480 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
12490 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
124a0 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
124b0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
124c0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
124d0 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
124e0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
124f0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
12500 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
12510 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
12520 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
12530 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
12540 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
12550 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
12560 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
12570 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
12580 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
12590 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
125a0 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
125b0 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
125c0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
125d0 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
125e0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
125f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12600 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
12610 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
12620 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
12630 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
12640 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
12650 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
12660 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47   || SQLITE_DEBUG
12670 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
12680 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
12690 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
126a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
126b0 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
126c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
126d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
126e0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
126f0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
12700 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
12710 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
12720 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
12730 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
12740 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
12750 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
12760 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69  extensions..*/.i
12770 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12780 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
12790 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
127a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
127b0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
127c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
127d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
127e0 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
127f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12800 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
12810 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
12820 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
12830 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
12840 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
12850 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
12860 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
12870 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
12880 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
12890 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
128a0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
128b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
128c0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
128d0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
128e0 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
128f0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
12900 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
12910 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12920 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
12930 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
12940 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
12950 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
12960 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12970 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
12980 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54  /*.** Set the BT
12990 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
129a0 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20  flag if newFlag 
129b0 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e  is 0 or 1.  If n
129c0 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a  ewFlag is -1,.**
129d0 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68   then make no ch
129e0 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72  anges.  Always r
129f0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
12a00 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  of the BTS_SECUR
12a10 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74  E_DELETE.** sett
12a20 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68  ing after the ch
12a30 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
12a40 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
12a50 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
12a60 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
12a70 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
12a80 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12a90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12aa0 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  r(p);.  if( newF
12ab0 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
12ac0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
12ad0 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45  = ~BTS_SECURE_DE
12ae0 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65  LETE;.    if( ne
12af0 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e  wFlag ) p->pBt->
12b00 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
12b10 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
12b20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42   } .  b = (p->pB
12b30 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
12b40 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
12b50 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  !=0;.  sqlite3Bt
12b60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12b70 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69  eturn b;.}.#endi
12b80 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
12b90 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
12ba0 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
12bb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12bc0 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
12bd0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
12be0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
12bf0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
12c00 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
12c10 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
12c20 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
12c30 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
12c40 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
12c50 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
12c60 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
12c70 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
12c80 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
12c90 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
12ca0 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
12cb0 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
12cc0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
12cd0 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
12ce0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12cf0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
12d00 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
12d10 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
12d20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12d30 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
12d40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
12d50 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
12d60 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12d70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12d80 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
12d90 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
12da0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12db0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
12dc0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
12dd0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
12de0 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
12df0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
12e00 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
12e10 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
12e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
12e30 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
12e40 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
12e50 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
12e60 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
12e70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12e80 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12e90 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
12ea0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
12eb0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
12ec0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
12ed0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
12ee0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
12ef0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
12f00 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
12f10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12f20 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
12f30 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
12f40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12f50 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
12f60 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
12f70 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
12f80 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
12f90 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12fa0 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
12fb0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
12fc0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
12fd0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
12fe0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
12ff0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
13000 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
13010 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
13020 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
13030 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13040 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
13050 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
13060 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
13070 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
13080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13090 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
130a0 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
130b0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
130c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
130d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
130e0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
130f0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
13100 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
13110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13120 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
13130 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
13140 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
13150 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
13160 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
13170 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
13180 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
13190 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
131a0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
131b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
131c0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
131d0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131f0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
13200 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
13210 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
13220 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
13230 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
13240 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
13250 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
13260 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
13270 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
13280 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
13290 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
132a0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
132b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
132c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
132d0 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
132e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
132f0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
13300 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
13310 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
13320 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13330 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
13350 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
13360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13370 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
13380 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
13390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
133a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
133b0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
133c0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
133d0 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
133e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
133f0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
13400 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
13410 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
13420 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
13430 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
13440 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
13450 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
13460 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
13470 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
13480 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
13490 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
134a0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
134b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
134c0 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
134d0 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
134e0 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
134f0 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
13500 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
13510 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
13520 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
13530 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
13540 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
13550 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
13560 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
13570 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
13580 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
13590 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
135a0 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
135b0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
135c0 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
135d0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
135e0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
135f0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
13600 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
13610 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
13620 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
13630 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
13640 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
13650 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13660 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
13670 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13680 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
13690 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
136a0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
136b0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
136c0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
136d0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
136e0 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
136f0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
13700 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
13710 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
13720 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
13730 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
13740 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
13750 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
13760 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
13770 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
13780 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
13790 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
137a0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
137b0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
137c0 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
137d0 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
137e0 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
137f0 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
13800 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
13810 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
13820 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
13830 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
13840 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
13850 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
13860 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
13870 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
13880 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
13890 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
138a0 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
138b0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
138c0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
138d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
138e0 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
138f0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
13900 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
13910 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
13920 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
13930 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
13940 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
13950 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
13960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
13980 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13990 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
139a0 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
139b0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
139c0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
139d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
139e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
139f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13a00 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
13a10 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
13a20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65  The maximum embe
13a30 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
13a40 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35  st be exactly 25
13a50 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69  %.  And the mini
13a60 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64  mum.    ** embed
13a70 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
13a80 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62  t be 12.5% for b
13a90 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e  oth leaf-data an
13aa0 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e  d non-leaf-data.
13ab0 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
13ac0 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
13ad0 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
13ae0 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
13af0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
13b00 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
13b10 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
13b20 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
13b30 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
13b40 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
13b50 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
13b60 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13b70 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13b80 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
13b90 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c  ze = (page1[16]<
13ba0 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d  <8) | (page1[17]
13bb0 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28  <<16);.    if( (
13bc0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
13bd0 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c  eSize)!=0.     |
13be0 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  | pageSize>SQLIT
13bf0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
13c00 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
13c10 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20  e<=256 .    ){. 
13c20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
13c30 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
13c40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
13c50 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
13c60 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   );.    usableSi
13c70 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
13c80 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
13c90 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65  f( (u32)pageSize
13ca0 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
13cb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
13cc0 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
13cd0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
13ce0 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
13cf0 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
13d00 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
13d10 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
13d20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
13d30 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
13d40 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
13d50 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
13d60 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
13d70 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
13d80 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
13d90 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
13da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
13db0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
13dc0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
13dd0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
13de0 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
13df0 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
13e00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
13e10 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
13e20 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
13e30 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
13e40 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
13e50 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
13e60 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
13e70 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
13e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13e90 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
13ea0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
13eb0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
13ef0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
13f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
13f10 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62      if( (pBt->db
13f20 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
13f30 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d  _RecoveryMode)==
13f40 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
13f50 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
13f60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
13f70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
13f80 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13f90 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
13fa0 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
13fb0 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
13fc0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13fd0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
13fe0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
13ff0 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
14000 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
14010 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
14020 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14030 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
14040 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
14050 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
14060 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
14070 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
14080 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14090 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
140a0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
140b0 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
140c0 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
140d0 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
140e0 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
140f0 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
14100 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
14110 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
14120 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
14130 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
14140 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
14150 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
14160 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
14170 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
14180 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
14190 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
141a0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
141b0 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
141c0 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
141d0 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
141e0 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
141f0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
14200 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
14210 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
14220 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
14230 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
14240 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
14250 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
14260 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
14270 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
14280 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
14290 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
142a0 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
142b0 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
142c0 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
142d0 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
142e0 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
142f0 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
14300 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
14310 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
14320 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
14330 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
14340 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
14350 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
14360 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
14370 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
14380 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
14390 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
143a0 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
143b0 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
143c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
143d0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
143e0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
143f0 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
14400 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
14410 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
14420 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
14430 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
14440 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
14450 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
14460 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
14470 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
14480 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
14490 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
144a0 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
144b0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
144c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
144d0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
144e0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
144f0 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
14500 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
14510 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14520 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
14530 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
14540 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
14550 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
14560 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
14570 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
14580 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
14590 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
145a0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
145b0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
145c0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
145d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
145e0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
145f0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
14600 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
14610 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
14620 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
14630 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
14640 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
14650 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
14660 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
14670 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
14680 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
14690 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
146a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
146b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
146c0 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
146d0 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
146e0 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
146f0 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
14700 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14710 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
14720 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
14730 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
14740 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
14750 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14760 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
14770 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
14780 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
14790 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
147a0 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65  >aData );.    re
147b0 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70  leasePage(pBt->p
147c0 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d  Page1);.    pBt-
147d0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d  >pPage1 = 0;.  }
147e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74  .}../*.** If pBt
147f0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d   points to an em
14800 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f  pty file then co
14810 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79  nvert that empty
14820 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20   file.** into a 
14830 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61  new empty databa
14840 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
14850 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
14860 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  e of.** the data
14870 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
14880 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28  int newDatabase(
14890 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
148a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a    MemPage *pP1;.
148b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
148c0 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b  *data;.  int rc;
148d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
148e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
148f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14900 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  if( pBt->nPage>0
14910 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14920 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14930 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
14940 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
14950 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
14960 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
14970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
14980 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
14990 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
149a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
149b0 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
149c0 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
149d0 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
149e0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
149f0 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
14a00 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d   );.  data[16] =
14a10 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
14a20 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a  Size>>8)&0xff);.
14a30 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38    data[17] = (u8
14a40 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
14a50 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64  >>16)&0xff);.  d
14a60 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
14a70 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61  ata[19] = 1;.  a
14a80 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
14a90 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67  leSize<=pBt->pag
14aa0 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73  eSize && pBt->us
14ab0 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42  ableSize+255>=pB
14ac0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
14ad0 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28  data[20] = (u8)(
14ae0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
14af0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
14b00 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
14b10 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
14b20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
14b30 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
14b40 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
14b50 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
14b60 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
14b70 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
14b80 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
14b90 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14ba0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
14bb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14bc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14bd0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
14be0 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
14bf0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
14c00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14c10 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
14c20 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
14c30 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
14c40 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
14c50 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
14c60 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
14c70 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
14c80 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
14c90 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
14ca0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a  pBt->nPage = 1;.
14cb0 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a    data[31] = 1;.
14cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14cd0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
14ce0 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73  tialize the firs
14cf0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
14d00 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65  tabase file (cre
14d10 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ating a database
14d20 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  .** consisting o
14d30 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
14d40 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62  and no schema ob
14d50 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53  jects). Return S
14d60 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73  QLITE_OK.** if s
14d70 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
14d80 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
14d90 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
14da0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14db0 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29  eNewDb(Btree *p)
14dc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
14dd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14de0 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50  p);.  p->pBt->nP
14df0 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  age = 0;.  rc = 
14e00 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70  newDatabase(p->p
14e10 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt);.  sqlite3Bt
14e20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14e30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14e40 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 61  ** Ensure that a
14e50 6e 79 20 72 6f 6f 74 20 70 61 67 65 20 72 65 66  ny root page ref
14e60 65 72 65 6e 63 65 73 20 68 65 6c 64 20 62 79 20  erences held by 
14e70 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 61 72 65  open cursors are
14e80 20 6e 6f 74 0a 2a 2a 20 6d 6d 61 70 20 70 61 67   not.** mmap pag
14e90 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
14ea0 74 20 62 74 72 65 65 53 77 61 70 4f 75 74 4d 6d  t btreeSwapOutMm
14eb0 61 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ap(BtShared *pBt
14ec0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14ed0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
14ee0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
14ef0 6f 64 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ode */.  BtCurso
14f00 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20  r *pCsr;        
14f10 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
14f20 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
14f30 75 67 68 20 61 6c 6c 20 6f 70 65 6e 20 63 75 72  ugh all open cur
14f40 73 6f 72 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  sors */..  for(p
14f50 43 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Csr=pBt->pCursor
14f60 3b 20 70 43 73 72 20 26 26 20 72 63 3d 3d 53 51  ; pCsr && rc==SQ
14f70 4c 49 54 45 5f 4f 4b 3b 20 70 43 73 72 3d 70 43  LITE_OK; pCsr=pC
14f80 73 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  sr->pNext){.    
14f90 69 66 28 20 70 43 73 72 2d 3e 69 50 61 67 65 3e  if( pCsr->iPage>
14fa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  =0 ){.      MemP
14fb0 61 67 65 20 2a 70 50 67 20 3d 20 70 43 73 72 2d  age *pPg = pCsr-
14fc0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20  >apPage[0];.    
14fd0 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67    if( pPg && pPg
14fe0 2d 3e 70 44 62 50 61 67 65 2d 3e 66 6c 61 67 73  ->pDbPage->flags
14ff0 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b   & PGHDR_MMAP ){
15000 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
15010 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
15020 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
15030 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 50 67  nitPage(pBt, pPg
15040 2d 3e 70 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 30  ->pgno, &pNew, 0
15050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15070 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
15080 73 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  sr->iPage==0 ){.
15090 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
150a0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 3d 20 70  ->info.pCell = p
150b0 4e 65 77 2d 3e 61 44 61 74 61 20 2b 20 28 70 43  New->aData + (pC
150c0 73 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2d  sr->info.pCell -
150d0 20 70 50 67 2d 3e 61 44 61 74 61 29 3b 0a 20 20   pPg->aData);.  
150e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
150f0 20 20 20 20 70 43 73 72 2d 3e 61 70 50 61 67 65      pCsr->apPage
15100 5b 30 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [0] = pNew;.    
15110 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
15120 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
15130 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
15140 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
15150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
15160 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
15170 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
15180 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
15190 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
151a0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
151b0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
151c0 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
151d0 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
151e0 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
151f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
15200 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
15210 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
15220 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
15230 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
15240 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
15250 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
15260 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
15270 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
15280 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
15290 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
152a0 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
152b0 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
152c0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
152d0 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
152e0 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
152f0 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
15300 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
15310 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
15320 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
15330 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
15340 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
15350 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
15360 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
15370 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
15380 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
15390 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
153a0 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
153b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
153c0 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
153d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
153e0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
153f0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
15400 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
15410 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
15420 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
15430 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15440 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
15450 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15460 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
15470 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
15480 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
15490 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
154a0 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
154b0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
154c0 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
154d0 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
154e0 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
154f0 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
15500 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
15510 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
15520 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
15530 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
15540 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
15550 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
15560 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
15570 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
15580 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
15590 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
155a0 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
155b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
155c0 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
155d0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
155e0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
155f0 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
15600 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
15610 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
15620 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
15630 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
15640 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
15650 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
15660 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
15670 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
15680 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
15690 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
156a0 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
156b0 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
156c0 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
156d0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
156e0 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
156f0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
15700 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
15710 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
15720 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
15730 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
15740 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
15750 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
15760 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
15770 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
15780 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
15790 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
157a0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
157b0 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
157c0 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
157d0 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
157e0 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
157f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
15800 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
15810 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
15820 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
15830 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
15840 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15850 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15860 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
15870 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15880 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
15890 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
158a0 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
158b0 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
158c0 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
158d0 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
158e0 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
158f0 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
15900 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
15910 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
15920 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
15930 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
15940 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
15950 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
15960 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
15970 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
15980 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
15990 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  un;.  }.  assert
159a0 28 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ( IfNotOmitAV(pB
159b0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
159c0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
159d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
159e0 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
159f0 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
15a00 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
15a10 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
15a20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
15a30 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
15a40 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15a50 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
15a60 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
15a70 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
15a80 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
15a90 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61  _CACHE.  /* If a
15aa0 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
15ab0 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
15ac0 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
15ad0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
15ae0 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
15af0 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
15b00 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
15b10 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
15b20 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
15b30 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
15b40 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a  TE_LOCKED..  */.
15b50 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
15b60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15b70 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
15b80 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74  ).   || (pBt->bt
15b90 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
15ba0 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20  DING)!=0.  ){.  
15bb0 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
15bc0 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d  pWriter->db;.  }
15bd0 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
15be0 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
15bf0 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
15c00 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
15c10 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
15c20 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
15c30 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
15c40 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
15c50 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
15c60 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
15c70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15c90 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b  .  if( pBlock ){
15ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
15cb0 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
15cc0 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
15cd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
15ce0 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
15cf0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
15d00 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64  _begun;.  }.#end
15d10 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
15d20 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
15d30 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
15d40 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
15d50 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
15d60 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
15d70 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
15d80 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
15d90 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
15da0 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
15db0 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
15dc0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
15dd0 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d  pened. */.  rc =
15de0 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
15df0 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
15e00 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
15e10 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c  LOCK);.  if( SQL
15e20 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74  ITE_OK!=rc ) got
15e30 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a  o trans_begun;..
15e40 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
15e50 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c  &= ~BTS_INITIALL
15e60 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70  Y_EMPTY;.  if( p
15e70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70  Bt->nPage==0 ) p
15e80 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
15e90 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
15ea0 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  PTY;.  do {.    
15eb0 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65  /* Call lockBtre
15ec0 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72  e() until either
15ed0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20   pBt->pPage1 is 
15ee0 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20  populated or.   
15ef0 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20   ** lockBtree() 
15f00 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e  returns somethin
15f10 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  g other than SQL
15f20 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65  ITE_OK. lockBtre
15f30 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72  e().    ** may r
15f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
15f50 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  but leave pBt->p
15f60 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69  Page1 set to 0 i
15f70 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72  f after.    ** r
15f80 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74  eading page 1 it
15f90 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
15fa0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
15fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
15fc0 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f     ** file is no
15fd0 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e  t pBt->pageSize.
15fe0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f   In this case lo
15ff0 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75  ckBtree() will u
16000 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74  pdate.    ** pBt
16010 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68  ->pageSize to th
16020 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
16030 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
16040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
16050 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  e( pBt->pPage1==
16060 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  0 && SQLITE_OK==
16070 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28  (rc = lockBtree(
16080 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66  pBt)) );..    if
16090 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
160a0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
160b0 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73     if( (pBt->bts
160c0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
160d0 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
160e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
160f0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
16100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16110 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16120 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
16130 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
16140 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
16150 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
16160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16180 72 63 20 3d 20 62 74 72 65 65 53 77 61 70 4f 75  rc = btreeSwapOu
16190 74 4d 6d 61 70 28 70 42 74 29 3b 0a 20 20 20 20  tMmap(pBt);.    
161a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
161b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
161c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
161d0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
161e0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
161f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
16200 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
16220 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
16230 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
16240 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
16250 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
16260 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
16270 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
16280 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
16290 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
162a0 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
162b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
162c0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
162d0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
162e0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
162f0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
16300 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16310 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16320 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
16330 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
16340 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
16350 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
16360 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
16370 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
16380 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
16390 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
163a0 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
163b0 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
163c0 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
163d0 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
163e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
163f0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
16400 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
16410 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
16420 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
16430 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
16440 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
16450 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
16460 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
16470 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
16480 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
16490 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
164a0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
164b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
164c0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
164d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
164e0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
164f0 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
16500 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
16510 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
16520 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
16530 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
16540 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
16550 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
16560 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
16570 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
16580 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
16590 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
165a0 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
165b0 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
165c0 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
165d0 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
165e0 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
165f0 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
16600 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
16610 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
16620 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
16630 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
16640 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
16650 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
16660 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
16670 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
16680 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
16690 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
166a0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
166b0 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
166c0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
166d0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
166e0 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
166f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
16700 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
16710 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16720 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
16730 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
16740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16760 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
16770 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
16780 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
16790 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
167a0 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
167b0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
167c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
167d0 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
167e0 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
167f0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
16800 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
16810 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
16820 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
16830 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
16840 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
16850 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
16860 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
16870 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
16880 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
16890 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
168a0 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
168b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
168c0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
168d0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
168e0 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
168f0 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
16900 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
16910 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16920 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16930 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
16940 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
16950 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
16960 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
16970 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
16980 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
16990 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
169a0 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
169b0 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
169c0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
169d0 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
169e0 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
169f0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
16a00 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
16a10 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
16a20 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
16a30 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
16a40 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
16a70 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
16a80 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16ab0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
16ac0 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
16ad0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16b00 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
16b10 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
16b20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
16b30 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
16b40 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
16b50 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
16b60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16b70 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
16b80 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
16b90 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
16ba0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
16bb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16bc0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
16bd0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
16be0 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
16bf0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
16c00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
16c10 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
16c20 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
16c30 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
16c40 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
16c50 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
16c60 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
16c70 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
16c80 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
16c90 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
16ca0 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
16cb0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
16cc0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
16cd0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
16ce0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
16cf0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
16d00 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
16d10 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
16d20 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
16d30 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
16d40 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
16d50 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
16d60 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
16d70 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
16d80 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
16d90 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
16da0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
16db0 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
16dc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
16dd0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
16de0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
16df0 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
16e00 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
16e10 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
16e20 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
16e30 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
16e40 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
16e50 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
16e60 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
16e70 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
16e80 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
16e90 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
16ea0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
16eb0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
16ec0 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
16ef0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
16f00 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
16f10 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
16f20 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
16f30 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
16f40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16f50 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
16f60 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
16f70 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
16f80 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
16f90 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
16fa0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
16fb0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
16fc0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
16fd0 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
16fe0 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
16ff0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
17000 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
17010 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
17020 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
17030 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
17040 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
17050 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
17060 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17070 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
17080 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
17090 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
170a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
170b0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
170c0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
170d0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
170e0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
170f0 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
17100 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
17110 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
17120 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
17130 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
17140 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
17150 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
17160 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
17170 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
17180 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
17190 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
171a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69   }else{.    u8 i
171b0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
171c0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
171d0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
171e0 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49  ell;..    btreeI
171f0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
17200 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
17210 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
17220 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
17230 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
17240 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
17250 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
17260 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
17270 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
17280 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
17290 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
172a0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
172b0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
172c0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
172d0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
172e0 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20  low.         && 
172f0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
17300 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61  flow+3<=pPage->a
17310 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
17320 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26  Page.         &&
17330 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
17340 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
17350 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20  erflow]).       
17360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
17370 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
17380 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
17390 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
173a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
173b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
173c0 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
173d0 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
173e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
173f0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
17400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
17410 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
17420 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
17430 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
17440 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
17450 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
17460 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
17470 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
17480 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
17490 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
174a0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
174b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
174c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
174d0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
174e0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
174f0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
17500 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
17510 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
17520 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
17530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
17540 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
17550 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
17560 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
17570 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
17580 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
17590 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
175a0 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
175b0 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
175c0 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
175d0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
175e0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
175f0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
17600 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
17610 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
17620 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
17630 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
17640 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
17650 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
17660 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
17670 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
17680 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
17690 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
176a0 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
176b0 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
176c0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
176d0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
176e0 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
176f0 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
17700 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
17710 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
17720 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
17730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17740 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
17750 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
17760 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
17770 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
17780 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
17790 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
177a0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
177b0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
177c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
177d0 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
177e0 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
177f0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
17800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
17810 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
17820 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
17830 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
17840 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
17850 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
17860 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
17870 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
17880 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
17890 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
178a0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
178b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
178c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
178d0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
178e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
178f0 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
17900 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
17910 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
17920 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
17930 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
17940 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
17950 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17960 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
17970 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
17980 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
17990 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
179a0 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
179b0 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
179c0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
179d0 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
179e0 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
179f0 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
17a00 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
17a10 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
17a20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
17a30 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
17a40 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
17a50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
17a60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17a70 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
17a80 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
17a90 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
17aa0 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
17ab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17ad0 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
17ae0 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
17af0 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
17b00 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
17b10 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
17b20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
17b30 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
17b40 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
17b50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
17b60 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
17b70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
17b80 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
17b90 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
17ba0 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
17bb0 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
17bc0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
17bd0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
17be0 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
17bf0 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
17c00 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
17c10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
17c20 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
17c30 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
17c40 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
17c50 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
17c60 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
17c70 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
17c80 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
17c90 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
17ca0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
17cb0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
17cc0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
17cd0 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
17ce0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
17cf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17d00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17d10 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
17d20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
17d30 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
17d40 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
17d50 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
17d60 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
17d70 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
17d80 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
17d90 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
17da0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
17db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17de0 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
17df0 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
17e00 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
17e10 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
17e20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
17e30 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
17e40 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
17e50 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
17e60 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
17e70 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
17e80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
17e90 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
17ea0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
17eb0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
17ec0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
17ed0 72 50 61 67 65 2c 20 30 2c 20 30 29 3b 0a 20 20  rPage, 0, 0);.  
17ee0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17ef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
17f00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
17f10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17f20 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
17f30 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
17f40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17f50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
17f60 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
17f70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17f80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
17f90 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
17fa0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
17fb0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
17fc0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
17fd0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
17fe0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
17ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18000 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
18010 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
18020 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
18030 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
18040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18050 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
18060 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
18070 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
18080 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
18090 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
180a0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
180b0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
180c0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
180d0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
180e0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
180f0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
18100 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
18110 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
18120 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
18130 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
18140 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
18150 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
18160 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
18170 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
18180 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
18190 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
181a0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
181b0 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
181c0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
181d0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
181e0 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
181f0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
18200 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
18210 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
18220 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
18230 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
18240 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
18250 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
18260 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
18270 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
18280 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
18290 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
182a0 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
182b0 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
182c0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
182d0 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
182e0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
182f0 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
18300 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
18310 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
18320 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
18330 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
18340 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
18350 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
18360 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
18370 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
18380 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
18390 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
183a0 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
183b0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
183c0 6e 2d 63 6f 6d 6d 6d 69 74 20 0a 2a 2a 20 6f 70  n-commmit .** op
183d0 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73  eration, or fals
183e0 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65  e for an increme
183f0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a  ntal vacuum..*/.
18400 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
18410 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
18420 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
18430 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
18440 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
18450 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
18460 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
18470 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
18480 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
18490 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
184a0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
184b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
184c0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
184d0 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
184e0 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
184f0 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
18500 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
18510 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
18520 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
18530 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
18540 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
18550 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
18560 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
18570 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
18580 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
18590 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
185a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
185b0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
185c0 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
185d0 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
185e0 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
185f0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18600 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18610 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18620 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
18630 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
18640 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
18650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18660 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
18670 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
18680 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
18690 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43   ){.      if( bC
186a0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
186b0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
186c0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
186d0 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
186e0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
186f0 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
18700 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e   if bCommit is n
18710 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
18720 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
18730 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
18740 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
18750 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
18760 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
18770 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
18780 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
18790 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
187a0 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
187b0 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
187c0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
187d0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
187e0 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
187f0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
18800 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
18810 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
18820 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
18830 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42  eePg, iLastPg, B
18840 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
18850 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18860 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18870 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18880 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18890 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
188a0 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
188b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
188c0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
188d0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
188e0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
188f0 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
18900 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
18910 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
18920 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
18930 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
18940 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65  stPg;.      u8 e
18950 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41  Mode = BTALLOC_A
18960 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61  NY;   /* Mode pa
18970 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
18980 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
18990 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e  */.      Pgno iN
189a0 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ear = 0;        
189b0 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72     /* nearby par
189c0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
189d0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
189e0 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  /..      rc = bt
189f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18a00 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
18a10 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
18a20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18a30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
18a40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18a50 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
18a60 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
18a70 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
18a80 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
18a90 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
18aa0 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
18ab0 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
18ac0 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
18ad0 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
18ae0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
18af0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
18b00 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
18b10 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
18b20 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
18b30 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
18b40 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
18b50 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
18b60 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
18b70 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
18b80 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
18b90 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
18ba0 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
18bb0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
18bc0 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
18bd0 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
18be0 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
18bf0 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
18c00 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
18c10 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
18c20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
18c30 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
18c40 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
18c50 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
18c60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18c80 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
18c90 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
18ca0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18cc0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18cd0 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
18ce0 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
18cf0 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
18d00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18d10 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
18d20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
18d30 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
18d40 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
18d50 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
18d60 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
18d70 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
18d80 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
18d90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18db0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18dc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18dd0 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
18de0 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
18df0 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
18e00 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
18e10 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
18e20 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
18e30 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
18e40 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
18e50 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
18e60 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
18e70 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
18e80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
18e90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18ea0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
18eb0 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
18ec0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
18ed0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
18ee0 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
18ef0 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
18f00 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
18f10 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
18f20 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
18f30 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
18f40 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
18f50 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
18f60 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
18f70 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
18f80 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
18f90 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
18fa0 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
18fb0 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
18fc0 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
18fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18fe0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
18ff0 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
19000 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
19010 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
19020 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19030 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
19040 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
19050 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
19080 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
19090 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
190a0 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
190b0 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
190c0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
190d0 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
190e0 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
190f0 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
19100 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
19110 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
19120 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
19130 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
19140 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
19150 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
19160 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
19170 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
19180 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
19190 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
191a0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
191b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
191c0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
191d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
191e0 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
191f0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
19200 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
19210 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
19220 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
19230 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
19240 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
19250 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
19260 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
19270 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
19280 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
19290 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
192a0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
192b0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
192c0 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
192d0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
192e0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
192f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
19300 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
19310 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
19320 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19330 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
19340 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
19350 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
19360 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
19370 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19380 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
19390 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
193a0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
193b0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
193c0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
193d0 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
193e0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
193f0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
19400 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
19410 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
19420 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
19430 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
19440 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
19450 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
19460 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
19470 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
19480 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
19490 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
194a0 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
194b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
194c0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
194d0 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
194e0 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
194f0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
19500 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19520 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
19530 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
19540 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
19550 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
19560 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
19570 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
19580 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
19590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
195a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
195b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
195c0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
195d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
195e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
195f0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
19600 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
19610 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
19620 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19630 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
19640 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19650 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19660 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
19670 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
19680 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
19690 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
196a0 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
196b0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
196c0 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
196d0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
196e0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
196f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
19700 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
19710 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
19720 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
19730 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19740 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
19750 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
19760 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
19770 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
19780 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
19790 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
197a0 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
197b0 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
197c0 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
197d0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
197e0 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
197f0 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
19800 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
19810 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
19820 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
19830 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
19840 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
19850 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
19860 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  unt(pPager) );..
19870 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19880 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
19890 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
198a0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
198b0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
198c0 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
198d0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
198e0 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
198f0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
19900 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
19910 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
19920 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
19930 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
19940 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
19950 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19960 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
19970 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
19980 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
19990 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
199a0 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
199b0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
199c0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
199d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
199e0 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
199f0 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
19a00 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
19a10 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
19a20 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
19a30 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
19a40 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
19a50 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
19a60 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
19a70 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
19a80 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
19a90 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
19aa0 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
19ab0 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
19ac0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
19ad0 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
19ae0 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
19af0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
19b00 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
19b10 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
19b20 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
19b30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19b40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19b50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
19b60 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
19b70 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
19b80 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20  [36]);.    nFin 
19b90 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
19ba0 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
19bb0 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  ;.    if( nFin>n
19bc0 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
19bd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19be0 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c  T;.    if( nFin<
19bf0 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
19c00 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
19c10 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
19c20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72     }.    for(iFr
19c30 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
19c40 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
19c50 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
19c60 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
19c70 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
19c80 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b  nFin, iFree, 1);
19c90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
19ca0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
19cb0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
19cc0 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
19cd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19ce0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
19cf0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
19d00 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
19d10 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
19d20 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
19d30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
19d40 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
19d50 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
19d60 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
19d70 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
19d80 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
19d90 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
19da0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74  e = 1;.      pBt
19db0 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
19dc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
19dd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19de0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
19df0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
19e00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
19e10 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71  assert( nRef>=sq
19e20 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
19e30 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
19e40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
19e50 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
19e60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19e70 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
19e80 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
19e90 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
19ea0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
19eb0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
19ec0 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
19ed0 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
19ee0 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
19ef0 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
19f00 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
19f10 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
19f20 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
19f30 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
19f40 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
19f50 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
19f60 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
19f70 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
19f80 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
19f90 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
19fa0 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
19fb0 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
19fc0 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
19fd0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
19fe0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
19ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
1a000 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
1a010 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
1a020 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
1a030 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
1a040 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
1a050 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
1a060 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
1a070 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
1a080 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
1a090 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
1a0a0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
1a0b0 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
1a0c0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
1a0d0 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
1a0e0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
1a0f0 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
1a100 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
1a110 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1a120 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
1a130 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
1a140 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1a150 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
1a160 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1a170 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
1a180 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
1a190 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
1a1a0 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
1a1b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
1a1c0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
1a1d0 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
1a1e0 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
1a1f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1a200 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
1a210 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1a220 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
1a230 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1a240 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1a250 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1a260 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
1a270 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
1a280 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
1a290 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
1a2a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a2b0 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
1a2c0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1a2d0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
1a2e0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
1a2f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a300 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
1a310 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
1a320 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
1a330 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
1a340 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
1a350 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
1a360 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
1a370 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
1a380 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
1a390 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
1a3a0 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
1a3b0 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
1a3c0 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
1a3d0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
1a3e0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1a3f0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
1a400 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1a410 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
1a420 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1a430 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
1a440 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1a450 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1a460 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1a470 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a480 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
1a490 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a4a0 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
1a4b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a4c0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
1a4d0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1a4e0 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
1a4f0 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
1a500 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a520 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1a530 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
1a540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a550 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a560 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  ( pBt->bDoTrunca
1a570 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
1a580 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1a590 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
1a5a0 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  r, pBt->nPage);.
1a5b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1a5c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a5d0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1a5e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
1a5f0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
1a600 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a610 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1a620 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1a630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a640 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
1a650 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
1a660 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
1a670 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
1a680 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
1a690 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1a6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a6b0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1a6c0 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
1a6d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a6e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
1a6f0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1a700 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1a710 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a720 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1a730 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
1a740 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
1a750 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
1a760 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69  ontent(pBt);.  i
1a770 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
1a780 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e 64  ANS_NONE && p->d
1a790 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
1a7a0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
1a7b0 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
1a7c0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
1a7d0 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
1a7e0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
1a7f0 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
1a800 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
1a810 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1a820 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
1a830 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
1a840 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
1a850 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1a860 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
1a870 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
1a880 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1a890 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
1a8a0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
1a8b0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1a8c0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1a8d0 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
1a8e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1a8f0 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
1a900 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
1a910 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
1a920 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
1a930 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1a940 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
1a950 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
1a960 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1a970 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
1a980 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
1a990 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
1a9a0 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
1a9b0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
1a9c0 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
1a9d0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
1a9e0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
1a9f0 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
1aa00 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1aa10 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1aa20 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
1aa30 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
1aa40 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1aa50 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1aa60 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1aa70 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
1aa80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
1aa90 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1aaa0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
1aab0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
1aac0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
1aad0 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
1aae0 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
1aaf0 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
1ab00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1ab10 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
1ab20 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
1ab30 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
1ab40 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1ab50 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1ab60 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
1ab70 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
1ab80 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
1ab90 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
1aba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1abb0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
1abc0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1abd0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
1abe0 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
1abf0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1ac00 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
1ac10 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1ac20 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
1ac30 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
1ac40 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1ac50 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
1ac60 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
1ac70 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1ac80 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
1ac90 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
1aca0 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
1acb0 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
1acc0 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
1acd0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
1ace0 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
1acf0 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
1ad00 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
1ad10 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
1ad20 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
1ad30 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
1ad40 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
1ad50 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
1ad60 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1ad70 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
1ad80 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
1ad90 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
1ada0 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
1adb0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1adc0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1add0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
1ade0 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
1adf0 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
1ae00 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
1ae10 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
1ae20 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
1ae30 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
1ae40 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
1ae50 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
1ae60 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
1ae70 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
1ae80 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1ae90 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
1aea0 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
1aeb0 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
1aec0 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
1aed0 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
1aee0 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
1aef0 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
1af00 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
1af10 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
1af20 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
1af30 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
1af40 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
1af50 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
1af60 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
1af70 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
1af80 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
1af90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1afa0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
1afb0 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
1afc0 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
1afd0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1afe0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1aff0 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
1b000 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
1b010 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
1b020 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
1b030 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
1b040 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
1b050 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
1b060 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
1b070 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1b080 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1b090 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b0a0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1b0b0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1b0c0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1b0d0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1b0e0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1b0f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1b100 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
1b110 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
1b120 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
1b130 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1b140 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1b150 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
1b160 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b170 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1b180 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
1b190 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
1b1a0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b1b0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
1b1c0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
1b1d0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1b1e0 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
1b1f0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1b200 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
1b210 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1b220 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1b230 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1b240 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b250 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1b260 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1b270 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b280 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
1b290 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
1b2a0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
1b2b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1b2c0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
1b2d0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1b2e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b2f0 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
1b300 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b310 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b320 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b330 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1b340 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1b350 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
1b360 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1b370 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1b380 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b390 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1b3a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b3b0 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
1b3c0 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
1b3d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1b3e0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
1b3f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1b400 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b410 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b420 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1b430 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
1b440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b450 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1b460 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1b470 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
1b480 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1b490 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1b4a0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1b4b0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
1b4c0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1b4d0 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72   of write-cursor
1b4e0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68  s open on this h
1b4f0 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66  andle. This is f
1b500 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1b510 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1b520 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1b530 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1b540 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1b550 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  fined..**.** For
1b560 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
1b570 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
1b580 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
1b590 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
1b5a0 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
1b5b0 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  f writing to the
1b5c0 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20   databse.  That 
1b5d0 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72  means the cursor
1b5e0 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   was.** original
1b5f0 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  ly opened for wr
1b600 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75  iting and the cu
1b610 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20  rsor has not be 
1b620 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68  disabled.** by h
1b630 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20  aving its state 
1b640 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f  changed to CURSO
1b650 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74  R_FAULT..*/.stat
1b660 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
1b670 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
1b680 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
1b690 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1b6a0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1b6b0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1b6c0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1b6d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1b6e0 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26  ( pCur->wrFlag &
1b6f0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
1b700 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
1b710 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
1b720 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
1b730 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b740 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
1b750 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
1b760 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
1b770 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
1b780 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
1b790 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74  or on BtShared t
1b7a0 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
1b7b0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
1b7c0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1b7d0 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
1b7e0 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ng cursors that 
1b7f0 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68  belong.** to oth
1b800 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1b810 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
1b820 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e  pen to be sharin
1b830 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77  g.** the cache w
1b840 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
1b850 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1b860 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
1b870 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1b880 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  s..** All cursor
1b890 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  s using the same
1b8a0 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74   cache must be t
1b8b0 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65  ripped.** to pre
1b8c0 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74  vent them from t
1b8d0 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
1b8e0 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20   btree after.** 
1b8f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  the rollback.  T
1b900 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
1b910 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62  have deleted tab
1b920 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20  les.** or moved 
1b930 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69  root pages, so i
1b940 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
1b950 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74  ent to.** save t
1b960 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
1b970 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72  cursor.  The cur
1b980 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69  sor must be.** i
1b990 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76  nvalidated..*/.v
1b9a0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1b9b0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
1b9c0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
1b9d0 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74  t errCode){.  Bt
1b9e0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28  Cursor *p;.  if(
1b9f0 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72 65 74   pBtree==0 ) ret
1ba00 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  urn;.  sqlite3Bt
1ba10 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1ba20 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
1ba30 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
1ba40 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1ba50 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
1ba60 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1ba70 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70  Cursor(p);.    p
1ba80 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1ba90 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
1baa0 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
1bab0 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  de;.    for(i=0;
1bac0 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
1bad0 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1bae0 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
1baf0 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  i]);.      p->ap
1bb00 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
1bb10 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1bb20 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1bb30 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  e);.}../*.** Rol
1bb40 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
1bb50 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
1bb60 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  s.  All cursors 
1bb70 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  will be.** inval
1bb80 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ided by this ope
1bb90 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
1bba0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75  empt to use a cu
1bbb0 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73  rsor.** that was
1bbc0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
1bbd0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
1bbe0 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65  peration will re
1bbf0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72  sult.** in an er
1bc00 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
1bc10 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1bc20 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1bc30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bc40 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1bc50 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1bc60 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1bc70 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1bc80 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1bc90 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
1bca0 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
1bcb0 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
1bcc0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1bcd0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1bce0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1bcf0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1bd00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
1bd10 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
1bd20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1bd30 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65   tripCode = save
1bd40 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1bd50 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 0);.  }else{.
1bd60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bd70 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
1bd80 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  ipCode ){.    sq
1bd90 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1bda0 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70  lCursors(p, trip
1bdb0 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62 74 72  Code);.  }.  btr
1bdc0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1bdd0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1bde0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1bdf0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
1be00 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
1be10 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
1be20 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1be30 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1be40 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
1be50 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1be60 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1be70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1be80 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1be90 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
1bea0 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
1beb0 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
1bec0 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
1bed0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
1bee0 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
1bef0 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
1bf00 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
1bf10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
1bf20 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
1bf30 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
1bf40 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
1bf50 26 70 50 61 67 65 31 2c 20 30 2c 20 30 29 3d 3d  &pPage1, 0, 0)==
1bf60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bf70 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
1bf80 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
1bf90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1bfa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bfb0 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
1bfc0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1bfd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1bfe0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1bff0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1c000 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
1c010 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
1c020 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1c030 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
1c040 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1c050 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
1c060 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
1c070 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
1c080 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
1c090 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1c0a0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
1c0b0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1c0c0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1c0d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c0e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c0f0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
1c100 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
1c110 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1c120 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
1c130 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
1c140 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
1c150 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
1c160 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
1c170 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
1c180 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
1c190 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
1c1a0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1c1b0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1c1c0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
1c1d0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
1c1e0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1c1f0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
1c200 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
1c210 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
1c220 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
1c230 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
1c240 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
1c250 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
1c260 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
1c270 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
1c280 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
1c290 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
1c2a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
1c2b0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
1c2c0 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
1c2d0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
1c2e0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
1c2f0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
1c300 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
1c310 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
1c320 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1c330 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
1c340 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
1c350 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1c360 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
1c370 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
1c380 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
1c390 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1c3a0 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
1c3b0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
1c3c0 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
1c3d0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
1c3e0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1c3f0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
1c400 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
1c410 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1c420 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
1c430 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
1c440 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
1c450 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
1c460 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
1c470 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
1c480 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
1c490 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
1c4a0 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
1c4b0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1c4c0 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
1c4d0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1c4e0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
1c4f0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
1c500 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
1c510 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1c520 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1c530 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1c540 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1c550 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
1c560 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1c570 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
1c580 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1c590 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
1c5a0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1c5b0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
1c5c0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
1c5d0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
1c5e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1c5f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1c600 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1c610 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
1c620 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
1c630 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1c640 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
1c650 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
1c660 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
1c670 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
1c680 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
1c690 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
1c6a0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
1c6b0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
1c6c0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
1c6d0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
1c6e0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
1c6f0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
1c700 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1c710 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
1c720 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
1c730 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1c740 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1c750 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
1c760 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
1c770 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1c780 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c790 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1c7a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1c7b0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
1c7c0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
1c7d0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
1c7e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1c7f0 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
1c800 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
1c810 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
1c820 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
1c830 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1c840 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
1c850 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
1c860 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
1c870 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
1c880 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
1c890 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1c8a0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1c8b0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
1c8c0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
1c8d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
1c8e0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
1c8f0 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
1c900 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
1c910 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1c920 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1c930 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
1c940 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
1c950 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
1c960 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
1c970 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
1c980 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
1c990 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
1c9a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
1c9b0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
1c9c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c9d0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
1c9e0 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1c9f0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
1ca00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ca10 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
1ca20 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1ca30 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1ca40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1ca50 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1ca60 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1ca70 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
1ca80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1ca90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1caa0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
1cab0 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
1cac0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
1cad0 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
1cae0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1caf0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
1cb00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
1cb10 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1cb20 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
1cb30 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
1cb40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cb50 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
1cb60 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
1cb70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
1cb80 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
1cb90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
1cba0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
1cbb0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1cbc0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1cbd0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1cbe0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
1cbf0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
1cc00 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
1cc10 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
1cc20 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
1cc30 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
1cc40 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
1cc50 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
1cc60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1cc70 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
1cc80 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
1cc90 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
1cca0 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
1ccb0 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
1ccc0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
1ccd0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
1cce0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ccf0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1cd00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1cd10 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
1cd20 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
1cd30 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
1cd40 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
1cd50 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
1cd60 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
1cd70 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1cd80 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
1cd90 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
1cda0 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
1cdb0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1cdc0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
1cdd0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1cde0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
1cdf0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
1ce00 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
1ce10 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1ce20 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
1ce30 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
1ce40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1ce50 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
1ce60 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1ce70 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
1ce80 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
1ce90 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
1cea0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1ceb0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1cec0 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
1ced0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
1cee0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
1cef0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
1cf00 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
1cf10 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
1cf20 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
1cf30 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
1cf40 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
1cf50 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
1cf60 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
1cf70 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
1cf80 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
1cf90 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
1cfa0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1cfb0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
1cfc0 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
1cfd0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
1cfe0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
1cff0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
1d000 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
1d010 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
1d020 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
1d030 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
1d040 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
1d050 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
1d060 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
1d070 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
1d080 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
1d090 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
1d0a0 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
1d0b0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
1d0c0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1d0d0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
1d0e0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
1d0f0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
1d100 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
1d110 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
1d120 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
1d130 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
1d140 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
1d150 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
1d160 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
1d170 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
1d180 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
1d190 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
1d1a0 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
1d1b0 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
1d1c0 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
1d1d0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
1d1e0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
1d1f0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
1d200 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
1d210 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
1d220 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
1d230 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
1d240 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1d250 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
1d260 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1d270 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1d280 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1d290 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1d2a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1d2d0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1d300 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1d310 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1d320 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d340 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1d350 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1d360 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1d370 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1d380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1d390 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
1d3a0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1d3b0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1d3c0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1d3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1d3e0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1d3f0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1d400 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1d410 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1d420 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1d430 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1d440 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1d450 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1d460 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1d470 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1d480 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1d490 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1d4a0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1d4b0 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1d4c0 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1d4d0 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1d4e0 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1d4f0 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1d500 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1d510 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1d520 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1d530 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1d540 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1d550 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1d560 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1d570 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1d580 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1d590 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1d5a0 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1d5b0 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1d5c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1d5d0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1d5e0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1d5f0 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1d600 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1d610 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1d620 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1d630 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1d640 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1d650 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1d660 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1d670 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1d680 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1d6a0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1d6b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1d6c0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1d6d0 77 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e  wrFlag && (pBt->
1d6e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1d6f0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b  EAD_ONLY)!=0) ){
1d700 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d710 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1d720 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1d730 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
1d740 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1d750 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1d760 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
1d770 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1d780 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1d790 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1d7a0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1d7b0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1d7c0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1d7d0 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1d7e0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1d7f0 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1d800 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1d810 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1d820 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1d830 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1d840 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1d850 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1d860 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1d870 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
1d880 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
1d890 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
1d8a0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
1d8b0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
1d8c0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1d8d0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1d8e0 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
1d8f0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1d900 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
1d910 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1d920 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63  VALID;.  pCur->c
1d930 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a  achedRowid = 0;.
1d940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d950 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1d960 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
1d970 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d9a0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1d9b0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1d9e0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1d9f0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1da00 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1da30 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1da40 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1da50 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1da60 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1da70 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1da80 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
1da90 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1daa0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
1dad0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
1dae0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1daf0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1db00 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
1db10 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
1db20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1db30 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
1db40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1db50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1db60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1db70 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
1db80 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
1db90 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
1dba0 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
1dbb0 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
1dbc0 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
1dbd0 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
1dbe0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
1dbf0 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
1dc00 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
1dc10 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
1dc20 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
1dc30 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
1dc40 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
1dc50 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
1dc60 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
1dc70 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1dc80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1dc90 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
1dca0 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
1dcb0 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
1dcc0 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
1dcd0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
1dce0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
1dcf0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
1dd00 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
1dd10 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
1dd20 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
1dd30 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
1dd40 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
1dd50 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
1dd60 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
1dd70 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
1dd80 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
1dd90 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
1dda0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
1ddb0 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
1ddc0 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
1ddd0 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
1dde0 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
1ddf0 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
1de00 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
1de10 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
1de20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1de30 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
1de40 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
1de50 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
1de60 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50  tof(BtCursor, iP
1de70 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
1de80 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72  Set the cached r
1de90 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76  owid value of ev
1dea0 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68  ery cursor in th
1deb0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
1dec0 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20  file.** as pCur 
1ded0 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73  and having the s
1dee0 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  ame root page nu
1def0 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54  mber as pCur.  T
1df00 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73  he value is.** s
1df10 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a  et to iRowid..**
1df20 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76  .** Only positiv
1df30 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61  e rowid values a
1df40 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61  re considered va
1df50 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63  lid for this cac
1df60 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65  he..** The cache
1df70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1df80 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74  to zero, indicat
1df90 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63  ing an invalid c
1dfa0 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65  ache..** A btree
1dfb0 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20   will work fine 
1dfc0 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67  with zero or neg
1dfd0 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57  ative rowids.  W
1dfe0 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a  e just cannot.**
1dff0 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e   cache zero or n
1e000 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20  egative rowids, 
1e010 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c  which means tabl
1e020 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f  es that use zero
1e030 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20   or.** negative 
1e040 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e  rowids might run
1e050 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
1e060 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69  .  But in practi
1e070 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e  ce, zero.** or n
1e080 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61  egative rowids a
1e090 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e  re very uncommon
1e0a0 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20   so this should 
1e0b0 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
1e0c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e0d0 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52  3BtreeSetCachedR
1e0e0 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
1e0f0 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Cur, sqlite3_int
1e100 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74  64 iRowid){.  Bt
1e110 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72  Cursor *p;.  for
1e120 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43  (p=pCur->pBt->pC
1e130 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1e140 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1e150 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72  ->pgnoRoot==pCur
1e160 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e  ->pgnoRoot ) p->
1e170 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52  cachedRowid = iR
1e180 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  owid;.  }.  asse
1e190 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64  rt( pCur->cached
1e1a0 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b  Rowid==iRowid );
1e1b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e1c0 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69   the cached rowi
1e1d0 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
1e1e0 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74  cursor.  A negat
1e1f0 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72  ive or zero.** r
1e200 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1e210 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72  cates that the r
1e220 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e  owid cache is in
1e230 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
1e240 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   be.** ignored. 
1e250 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61   If the rowid ca
1e260 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  che has never be
1e270 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74  fore been set, t
1e280 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73  hen a.** zero is
1e290 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71   returned..*/.sq
1e2a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1e2b0 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65  te3BtreeGetCache
1e2c0 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1e2d0 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1e2e0 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1e2f0 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  id;.}../*.** Clo
1e300 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
1e310 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
1e320 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e330 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
1e340 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
1e350 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
1e360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e370 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
1e380 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1e390 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
1e3a0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1e3b0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1e3c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
1e3d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1e3e0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
1e3f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1e400 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
1e410 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1e420 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
1e430 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
1e440 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1e450 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
1e460 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1e470 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d  else{.      pBt-
1e480 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
1e490 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
1e4a0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1e4b0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1e4c0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1e4d0 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pCur->pPrev;.   
1e4e0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1e4f0 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1e500 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1e510 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1e520 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
1e530 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1e540 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1e550 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1e560 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
1e570 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1e580 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
1e590 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1e5a0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1e5b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1e5c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
1e5d0 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
1e5e0 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
1e5f0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
1e600 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
1e610 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
1e620 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
1e630 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
1e640 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
1e650 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
1e660 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
1e670 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
1e680 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
1e690 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
1e6a0 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
1e6b0 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
1e6c0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
1e6d0 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
1e6e0 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
1e6f0 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
1e700 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
1e710 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
1e720 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
1e730 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
1e740 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
1e750 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
1e760 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
1e770 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
1e780 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
1e790 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
1e7a0 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
1e7b0 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
1e7c0 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
1e7d0 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
1e7e0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1e7f0 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
1e800 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
1e810 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
1e820 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
1e830 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
1e840 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
1e850 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1e860 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
1e870 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
1e880 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
1e890 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
1e8a0 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
1e8b0 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
1e8c0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1e8d0 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
1e8e0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
1e8f0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1e900 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
1e910 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
1e920 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
1e930 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1e940 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1e950 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
1e960 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
1e970 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
1e980 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
1e990 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
1e9a0 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
1e9b0 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
1e9c0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
1e9d0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
1e9e0 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
1e9f0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
1ea00 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
1ea10 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
1ea20 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
1ea30 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
1ea40 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1ea50 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
1ea60 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1ea70 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
1ea80 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1ea90 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62  ->iPage;.      b
1eaa0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1eab0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1eac0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1ead0 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1eae0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
1eaf0 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
1eb00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1eb10 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1eb20 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
1eb30 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
1eb40 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
1eb50 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
1eb60 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
1eb70 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
1eb80 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
1eb90 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
1eba0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
1ebf0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1ec00 20 29 7b 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 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
1ec40 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1ec50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
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 5c 0a 20 20 20 20 62 74 72         \.    btr
1ec90 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1eca0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1ecb0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1ecc0 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1ecd0 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c   \.    pCur->val
1ece0 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20  idNKey = 1;     
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed70 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
1ed80 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66      \.  }.#endif
1edd0 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a   /* _MSC_VER */.
1ede0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
1edf0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
1ee00 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
1ee10 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1ee20 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
1ee30 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1ee40 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
1ee50 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
1ee60 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
1ee70 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
1ee80 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1ee90 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
1eea0 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
1eeb0 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
1eec0 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
1eed0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
1eee0 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1eef0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
1ef00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ef10 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1ef20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1ef30 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
1ef40 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
1ef50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
1ef60 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
1ef70 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
1ef80 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
1ef90 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1efa0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
1efb0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
1efc0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
1efd0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
1efe0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1eff0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
1f000 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1f010 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
1f020 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
1f030 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
1f040 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
1f050 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
1f060 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
1f070 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
1f080 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1f090 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
1f0a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1f0b0 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
1f0c0 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
1f0d0 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
1f0e0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
1f0f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1f100 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
1f110 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1f120 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
1f130 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
1f140 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
1f150 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
1f160 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1f170 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f180 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1f190 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f1a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
1f1b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f1c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1f1d0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1f1e0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
1f1f0 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  ){.    *pSize = 
1f200 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1f210 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1f220 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
1f230 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1f240 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f250 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f260 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1f270 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1f280 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
1f290 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
1f2a0 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
1f2b0 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a   points to..**.*
1f2c0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1f2d0 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
1f2e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
1f2f0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
1f300 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
1f310 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
1f320 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
1f330 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
1f340 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
1f350 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
1f360 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
1f370 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
1f380 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  **.** Failure is
1f390 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
1f3a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
1f3b0 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1f3c0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69  ITE_OK..** It mi
1f3d0 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c  ght just as well
1f3e0 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20   be a procedure 
1f3f0 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29  (returning void)
1f400 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65   but we continue
1f410 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  .** to return an
1f420 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20   integer result 
1f430 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69  code for histori
1f440 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a  cal reasons..*/.
1f450 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f460 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
1f470 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
1f480 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
1f490 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f4a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1f4b0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1f4c0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1f4d0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
1f4e0 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
1f4f0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  = pCur->info.nDa
1f500 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ta;.  return SQL
1f510 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f520 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
1f530 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
1f540 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1f550 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
1f560 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
1f570 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
1f580 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
1f590 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1f5a0 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
1f5b0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
1f5c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
1f5d0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
1f5e0 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
1f5f0 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
1f600 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
1f610 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
1f620 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
1f630 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
1f640 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1f650 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
1f660 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1f670 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1f680 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
1f690 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1f6a0 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
1f6b0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
1f6c0 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
1f6d0 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
1f6e0 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
1f6f0 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
1f700 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
1f710 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
1f720 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
1f730 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
1f740 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
1f750 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
1f760 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
1f770 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
1f780 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
1f790 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
1f7a0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
1f7b0 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
1f7c0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1f7d0 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
1f7e0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
1f7f0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1f800 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
1f810 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
1f820 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
1f830 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
1f840 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
1f850 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
1f860 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1f870 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
1f880 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1f890 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
1f8a0 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
1f8b0 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
1f8c0 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
1f8d0 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
1f8e0 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
1f8f0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1f900 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f910 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f920 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66  /* Current overf
1f950 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1f960 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
1f970 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1f980 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
1f990 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
1f9a0 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
1f9b0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
1f9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1f9d0 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
1f9e0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
1f9f0 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
1fa00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1fa10 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
1fa20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1fa30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1fa40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1fa50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1fa60 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
1fa70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fa80 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1fa90 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1faa0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1fab0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
1fac0 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
1fad0 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
1fae0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
1faf0 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
1fb00 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
1fb10 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
1fb20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
1fb30 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
1fb40 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
1fb50 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
1fb60 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
1fb70 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
1fb80 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
1fb90 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
1fba0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1fbb0 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
1fbc0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
1fbd0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1fbe0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
1fbf0 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
1fc00 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
1fc10 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
1fc20 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1fc30 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
1fc40 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
1fc50 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1fc60 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
1fc70 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
1fc80 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65  if( iGuess<=btre
1fc90 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
1fca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
1fcb0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
1fcc0 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
1fcd0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1fce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1fcf0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1fd00 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
1fd10 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
1fd20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
1fd30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1fd40 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1fd50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1fd60 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65  if..  assert( ne
1fd70 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  xt==0 || rc==SQL
1fd80 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
1fd90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fda0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1fdb0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
1fdc0 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 2c 20 28  fl, &pPage, 0, (
1fdd0 70 70 50 61 67 65 3d 3d 30 29 29 3b 0a 20 20 20  ppPage==0));.   
1fde0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1fdf0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
1fe00 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
1fe10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fe20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
1fe30 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1fe40 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
1fe50 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
1fe60 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
1fe70 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
1fe80 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
1fe90 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
1fea0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
1feb0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
1fec0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
1fed0 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
1fee0 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
1fef0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
1ff00 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
1ff10 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
1ff20 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
1ff30 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
1ff40 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
1ff50 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1ff60 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
1ff70 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
1ff80 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
1ff90 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
1ffa0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
1ffb0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
1ffc0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
1ffd0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
1ffe0 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
1fff0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
20000 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
20010 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
20020 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
20030 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
20040 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
20050 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
20060 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
20070 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20080 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
20090 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
200a0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
200b0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
200c0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
200d0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
200e0 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
200f0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
20100 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
20110 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
20120 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
20130 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
20140 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20150 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
20160 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20180 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
20190 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
201a0 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
201b0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
201c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
201d0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
201e0 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
201f0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
20200 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
20210 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
20220 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
20230 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
20240 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20250 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
20260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
20280 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20290 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
202a0 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
202b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
202c0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
202d0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
202e0 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
202f0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
20300 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
20310 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
20320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20340 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
20350 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
20360 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
20370 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
20380 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
20390 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
203a0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
203b0 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
203c0 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
203d0 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
203e0 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
203f0 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
20400 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
20410 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
20420 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
20430 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
20440 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
20450 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
20460 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
20470 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
20480 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
20490 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
204a0 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
204b0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
204c0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
204d0 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
204e0 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
204f0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
20500 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
20510 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
20520 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
20530 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
20540 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
20550 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
20560 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
20570 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
20580 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
20590 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
205a0 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
205b0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
205c0 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
205d0 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
205e0 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
205f0 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
20600 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
20610 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
20620 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
20630 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
20640 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
20650 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
20660 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
20670 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
20680 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
20690 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
206a0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
206b0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
206c0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
206d0 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
206e0 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
206f0 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
20700 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
20710 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
20720 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
20730 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
20740 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
20750 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
20760 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
20770 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
20780 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
20790 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
207a0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
207b0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
207c0 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
207d0 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
207e0 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
207f0 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
20800 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
20810 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
20820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
20830 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
20840 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
20850 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
20860 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
20870 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
20880 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
20890 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
208a0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
208b0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
208c0 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
208d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
208e0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
208f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
20900 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
20910 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
20920 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
20930 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
20940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
20950 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
20960 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
20970 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
20980 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
20990 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
209a0 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  _OK;.  u32 nKey;
209b0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
209c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
209d0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
209e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
209f0 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
20a00 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
20a10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20a20 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a40 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
20a50 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
20a60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
20a70 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
20a80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20a90 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
20aa0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
20ab0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20ac0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
20ad0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
20ae0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
20af0 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
20b00 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
20b10 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
20b20 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
20b30 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
20b40 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e   nKey = (pPage->
20b50 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e  intKey ? 0 : (in
20b60 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
20b70 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52  y);..  if( NEVER
20b80 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b  (offset+amt > nK
20b90 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
20ba0 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61  ata) .   || &aPa
20bb0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
20bc0 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
20bd0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
20be0 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20  ableSize].  ){. 
20bf0 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
20c00 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
20c10 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
20c20 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
20c30 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
20c40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20c50 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
20c60 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
20c70 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
20c80 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
20c90 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
20ca0 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
20cb0 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
20cc0 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
20cd0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
20ce0 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
20cf0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
20d00 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
20d10 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
20d20 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
20d30 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
20d40 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
20d50 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
20d60 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
20d70 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
20d80 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
20d90 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
20da0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
20db0 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
20dc0 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
20dd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20de0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
20df0 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
20e00 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
20e10 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
20e20 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
20e30 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
20e40 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
20e50 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
20e60 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
20e70 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
20e80 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65  Local]);..#ifnde
20e90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
20ea0 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66  CRBLOB.    /* If
20eb0 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48   the isIncrblobH
20ec0 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
20ed0 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73  t and the BtCurs
20ee0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20  or.aOverflow[]. 
20ef0 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
20f00 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
20f10 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  locate it now. T
20f20 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  he array is size
20f30 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  d at.    ** one 
20f40 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
20f50 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
20f60 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
20f70 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  in. The.    ** p
20f80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
20f90 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
20fa0 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
20fb0 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
20fc0 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76  .    ** etc. A v
20fd0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
20fe0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
20ff0 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ay means "not ye
21000 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20  t known".    ** 
21010 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
21020 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
21030 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21040 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
21050 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d  Handle && !pCur-
21060 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
21070 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
21080 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
21090 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
210a0 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
210b0 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
210c0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
210d0 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
210e0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
210f0 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66  izeof(Pgno)*nOvf
21100 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76  l);.      /* nOv
21110 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70 6f 73  fl is always pos
21120 69 74 69 76 65 2e 20 20 49 66 20 69 74 20 77 65  itive.  If it we
21130 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68 50 61  re zero, fetchPa
21140 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61 76 65  yload would have
21150 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 75  .      ** been u
21160 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
21170 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a  his routine. */.
21180 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
21190 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43 75 72  (nOvfl) && !pCur
211a0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
211b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
211c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
211d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
211e0 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
211f0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
21200 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
21210 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
21220 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
21230 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
21240 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
21250 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
21260 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
21270 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
21280 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
21290 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
212a0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
212b0 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
212c0 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
212d0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
212e0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
212f0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
21300 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
21310 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
21320 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
21330 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
21340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
21350 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
21360 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
21370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
21380 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
21390 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
213a0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
213b0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
213c0 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
213d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
213e0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
213f0 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
21400 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
21410 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
21420 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
21430 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
21440 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
21450 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
21460 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
21470 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
21480 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
21490 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
214a0 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
214b0 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
214c0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
214d0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
214e0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
214f0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
21500 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
21510 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
21520 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
21530 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
21540 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
21550 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
21560 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
21570 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
21580 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
21590 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
215a0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
215b0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
215c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
215d0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
215e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
215f0 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
21600 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
21610 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
21620 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
21630 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
21640 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
21650 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
21660 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
21670 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
21680 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
21690 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
216a0 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
216b0 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
216c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
216d0 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
216e0 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
216f0 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
21700 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
21710 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
21720 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
21730 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
21740 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
21750 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66         */.#ifdef
21760 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
21770 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
21780 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
21790 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20  e *fd;.#endif.  
217a0 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
217b0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
217c0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
217d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
217e0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
217f0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
21800 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
21810 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
21820 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
21830 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
21840 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
21850 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
21860 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
21870 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
21880 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
21890 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
218a0 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
218b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
218c0 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
218d0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
218e0 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62 61     3) the databa
218f0 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65  se is file-backe
21900 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  d, and.        *
21910 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73 20  *   4) there is 
21920 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72  no open write-tr
21930 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
21940 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
21950 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
21960 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  ot a WAL databas
21970 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e,.        **.  
21980 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
21990 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
219a0 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
219b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
219c0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
219d0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
219e0 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
219f0 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
21a00 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
21a10 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
21a20 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
21a30 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
21a40 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
21a50 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
21a60 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
21a70 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
21ab0 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
21af0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
21b00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21b10 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
21b40 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
21b50 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
21b60 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
21b70 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33  ethods     /* (3
21b80 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
21b90 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
21ba0 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20  ata[19]==0x01   
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bc0 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
21bd0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21be0 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
21bf0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
21c00 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
21c10 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
21c20 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
21c30 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
21c40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
21c50 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
21c60 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
21c70 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
21c80 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
21c90 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
21ca0 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
21cb0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
21cc0 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
21cd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
21ce0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
21cf0 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
21d00 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
21d10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21d20 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
21d30 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
21d40 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a  Page, &pDbPage,.
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
21d60 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 41 43  Op==0 ? PAGER_AC
21d70 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QUIRE_READONLY :
21d80 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
21d90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
21da0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21db0 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
21dc0 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
21dd0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
21de0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
21df0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
21e00 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
21e10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
21e20 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
21e30 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
21e40 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
21e50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
21e70 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
21e80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
21e90 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
21ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21eb0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
21ec0 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
21ed0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
21ee0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
21ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
21f00 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
21f10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
21f20 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
21f30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21f40 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
21f50 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
21f60 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
21f70 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
21f80 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
21f90 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
21fa0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
21fb0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
21fc0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
21fd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
21fe0 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
21ff0 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
22000 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
22010 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ow.** in the tab
22020 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
22030 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22040 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
22050 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
22060 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
22070 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
22080 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
22090 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
220a0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
220b0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
220c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
220d0 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
220e0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
220f0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
22100 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
22110 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22120 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22130 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22140 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22150 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
22160 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
22170 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
22180 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
22190 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
221a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
221b0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
221c0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
221d0 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
221e0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
221f0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
22200 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
22210 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
22220 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
22230 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
22240 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
22250 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
22260 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
22270 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
22280 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
22290 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
222a0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
222b0 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
222c0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
222d0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
222e0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
222f0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
22300 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
22310 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
22320 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
22330 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
22340 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
22350 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22360 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
22370 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
22380 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
22390 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
223a0 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
223b0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
223c0 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
223d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
223e0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
223f0 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
22400 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
22410 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22420 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
22430 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
22440 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
22450 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
22460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22470 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
22480 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22490 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
224a0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
224b0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
224c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
224d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
224e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
224f0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
22500 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22510 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
22520 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
22530 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
22540 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
22550 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22560 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22570 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
22580 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
22590 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
225a0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
225b0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
225c0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
225d0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
225e0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
225f0 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b  the key if skipK
22600 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69  ey==0 and it poi
22610 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e  nts to the begin
22620 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a  ning of data if.
22630 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20  ** skipKey==1.  
22640 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
22650 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
22660 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
22670 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41  tten.** into *pA
22680 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
22690 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
226a0 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
226b0 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64  ot be.** a valid
226c0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
226d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
226e0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
226f0 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
22700 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
22710 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
22720 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
22730 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
22740 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
22750 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
22760 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
22770 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
22780 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
22790 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
227a0 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
227b0 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
227c0 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
227d0 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
227e0 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
227f0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
22800 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
22810 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
22820 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
22830 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
22840 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
22850 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
22860 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
22870 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
22880 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
22890 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
228a0 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
228b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
228c0 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
228d0 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
228e0 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
228f0 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
22900 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
22910 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
22920 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
22930 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
22940 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
22950 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
22960 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
22970 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
22980 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
22990 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
229a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
229b0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
229c0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
229d0 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
229e0 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
229f0 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
22a00 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
22a10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
22a20 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
22a30 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
22a40 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63  nKey;.  u32 nLoc
22a50 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
22a60 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
22a70 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
22a80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22a90 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
22aa0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22ab0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
22ac0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
22ad0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
22ae0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
22af0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22b00 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
22b10 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
22b20 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
22b30 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  e->nCell );.  if
22b40 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e  ( NEVER(pCur->in
22b50 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a  fo.nSize==0) ){.
22b60 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
22b70 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
22b80 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43  pCur->iPage], pC
22b90 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22ba0 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20  iPage],.        
22bb0 20 20 20 20 20 20 20 20 20 20 20 26 70 43 75 72             &pCur
22bc0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61  ->info);.  }.  a
22bd0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
22be0 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
22bf0 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
22c00 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
22c10 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
22c20 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
22c30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
22c40 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72  nKey = (int)pCur
22c50 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
22c60 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
22c70 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b  {.    aPayload +
22c80 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63  = nKey;.    nLoc
22c90 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
22ca0 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20  nLocal - nKey;. 
22cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63   }else{.    nLoc
22cc0 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
22cd0 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65  nLocal;.    asse
22ce0 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79  rt( nLocal<=nKey
22cf0 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20   );.  }.  *pAmt 
22d00 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
22d10 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
22d20 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
22d30 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
22d40 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
22d50 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
22d60 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
22d70 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
22d80 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
22d90 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
22da0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
22db0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
22dc0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
22dd0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
22de0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
22df0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
22e00 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
22e10 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
22e20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
22e30 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
22e40 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
22e50 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
22e60 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
22e70 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
22e80 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
22e90 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
22ea0 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
22eb0 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
22ec0 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
22ed0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
22ee0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
22ef0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
22f00 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
22f10 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
22f20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
22f30 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
22f40 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
22f50 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
22f60 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
22f70 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
22f80 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
22f90 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
22fa0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
22fb0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
22fc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
22fd0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
22fe0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
22ff0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23000 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23010 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
23020 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23030 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20  RSOR_VALID) ){. 
23040 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f     p = (const vo
23050 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
23060 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
23070 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
23080 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
23090 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
230a0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
230b0 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
230c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
230d0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
230e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
230f0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
23100 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
23110 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23120 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23130 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
23140 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23150 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20  RSOR_VALID) ){. 
23160 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f     p = (const vo
23170 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
23180 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b  (pCur, pAmt, 1);
23190 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
231a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
231b0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
231c0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
231d0 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
231e0 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
231f0 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
23200 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
23210 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
23220 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
23230 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
23240 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
23250 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
23260 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
23270 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
23280 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
23290 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
232a0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
232b0 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
232c0 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
232d0 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
232e0 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
232f0 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
23300 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
23310 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
23320 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
23330 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
23340 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
23350 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
23360 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
23370 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
23380 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
23390 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
233a0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
233b0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
233c0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
233d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
233e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
233f0 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
23400 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
23410 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23420 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
23430 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
23440 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
23450 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
23460 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23470 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
23480 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
23490 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
234a0 20 26 70 4e 65 77 50 61 67 65 2c 20 28 70 43 75   &pNewPage, (pCu
234b0 72 2d 3e 77 72 46 6c 61 67 3d 3d 30 29 29 3b 0a  r->wrFlag==0));.
234c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
234d0 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
234e0 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
234f0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
23500 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
23510 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
23520 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23530 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
23540 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
23550 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
23560 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
23570 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
23580 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
23590 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
235a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
235b0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
235c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
235d0 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61  ..#if 0./*.** Pa
235e0 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
235f0 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
23600 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
23610 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
23620 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
23630 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
23640 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
23650 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
23660 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
23670 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
23680 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
23690 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
236a0 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
236b0 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
236c0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
236d0 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
236e0 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
236f0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
23700 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
23710 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
23720 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
23730 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
23740 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
23750 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
23760 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
23770 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
23780 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
23790 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
237a0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
237b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
237c0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
237d0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
237e0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
237f0 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
23800 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
23810 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
23820 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
23830 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
23840 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
23850 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
23860 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
23870 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
23880 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
23890 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
238a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
238b0 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
238c0 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
238d0 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
238e0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
238f0 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
23900 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
23910 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
23920 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
23930 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
23940 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
23950 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
23960 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
23970 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
23980 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23990 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
239a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
239b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
239c0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
239d0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
239e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
239f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23a00 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50  age] );..  /* UP
23a10 44 41 54 45 3a 20 49 74 20 69 73 20 61 63 74 75  DATE: It is actu
23a20 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f  ally possible fo
23a30 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  r the condition 
23a40 74 65 73 74 65 64 20 62 79 20 74 68 65 20 61 73  tested by the as
23a50 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  sert.  ** below 
23a60 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66 20  to be untrue if 
23a70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23a80 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68  e is corrupt. Th
23a90 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a  is can occur if.
23aa0 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20    ** one cursor 
23ab0 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67  has modified pag
23ac0 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20  e pParent while 
23ad0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
23ae0 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20  t is held .  ** 
23af0 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  by a second curs
23b00 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e  or. Which can on
23b10 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20 73  ly happen if a s
23b20 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69  ingle page is li
23b30 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d  nked.  ** into m
23b40 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
23b50 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 6e  ree structure in
23b60 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
23b70 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ase.  */.#if 0. 
23b80 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
23b90 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
23ba0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23bb0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
23bc0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23bd0 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
23be0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23bf0 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
23c00 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73  #endif.  testcas
23c10 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
23c20 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
23c30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23c40 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
23c50 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ll );..  release
23c60 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
23c70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
23c80 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
23c90 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
23ca0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
23cb0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
23cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
23cd0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
23ce0 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
23cf0 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
23d00 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
23d10 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
23d20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
23d30 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
23d40 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
23d50 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
23d60 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
23d70 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
23d80 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
23d90 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
23da0 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
23db0 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
23dc0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
23dd0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
23de0 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
23df0 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
23e00 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
23e10 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
23e20 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
23e30 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
23e40 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
23e50 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
23e60 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
23e70 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
23e80 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
23e90 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
23ea0 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
23eb0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
23ec0 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
23ed0 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
23ee0 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
23ef0 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
23f00 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
23f10 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
23f20 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
23f30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
23f40 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
23f50 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
23f60 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
23f70 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
23f80 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
23f90 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
23fa0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
23fb0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
23fc0 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
23fd0 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
23fe0 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
23ff0 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
24000 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
24010 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
24020 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
24030 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
24040 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
24050 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
24060 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
24070 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
24080 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
24090 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
240a0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
240b0 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
240c0 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
240d0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
240e0 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
240f0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
24100 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
24110 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
24120 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24130 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
24140 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
24150 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
24160 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
24170 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24180 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
24190 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
241a0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
241b0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
241c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
241d0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
241e0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
241f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
24200 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
24210 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
24220 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
24230 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
24240 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
24250 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
24260 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
24270 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
24280 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
24290 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
242a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
242b0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
242c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
242d0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
242e0 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
242f0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
24300 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
24310 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43    for(i=1; i<=pC
24320 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
24330 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
24340 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
24350 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  i]);.    }.    p
24360 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
24370 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
24380 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
24390 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
243a0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
243b0 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
243c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
243d0 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  e{.    rc = getA
243e0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
243f0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
24400 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
24410 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24430 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
24440 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
24450 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
24460 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
24470 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
24480 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  .    /* If pCur-
24490 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
244a0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
244b0 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
244c0 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
244d0 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74     ** expected t
244e0 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
244f0 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
24500 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
24510 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e  Info is.    ** N
24520 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
24530 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
24540 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
24550 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
24560 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  .    ** return a
24570 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
24580 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
24590 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
245a0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
245b0 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =1 || pCur->apPa
245c0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30  ge[0]->intKey==0
245d0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75   );.    if( (pCu
245e0 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
245f0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
24600 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
24610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24620 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
24630 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73    }.  }..  /* As
24640 73 65 72 74 20 74 68 61 74 20 74 68 65 20 72 6f  sert that the ro
24650 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20 74 68  ot page is of th
24660 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20  e correct type. 
24670 54 68 69 73 20 6d 75 73 74 20 62 65 20 74 68 65  This must be the
24680 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68  .  ** case as th
24690 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  e call to this f
246a0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61  unction that loa
246b0 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  ded the root-pag
246c0 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74  e (either.  ** t
246d0 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72  his call or a pr
246e0 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f  evious invocatio
246f0 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  n) would have de
24700 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
24710 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61  n .  ** if the a
24720 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e  ssumption were n
24730 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20  ot true, and it 
24740 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
24750 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20  for the flags . 
24760 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65   ** byte to have
24770 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77   been modified w
24780 68 69 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72  hile this cursor
24790 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
247a0 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20  ference.  ** to 
247b0 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  the page.  */.  
247c0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
247d0 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
247e0 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
247f0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
24800 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
24810 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43  t->isInit && (pC
24820 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
24830 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  ==pRoot->intKey 
24840 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  );..  pCur->aiId
24850 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
24860 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24870 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  ;.  pCur->atLast
24880 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
24890 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
248a0 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
248b0 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
248c0 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
248d0 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28  subpage;.    if(
248e0 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20   pRoot->pgno!=1 
248f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24900 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
24910 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
24920 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
24930 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
24940 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
24950 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
24960 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
24970 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
24980 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
24990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
249a0 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f  ->eState = ((pRo
249b0 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52  ot->nCell>0)?CUR
249c0 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52  SOR_VALID:CURSOR
249d0 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20  _INVALID);.  }. 
249e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
249f0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
24a00 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
24a10 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
24a20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
24a30 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
24a40 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
24a50 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
24a60 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
24a70 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
24a80 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
24a90 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
24aa0 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
24ab0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
24ac0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
24ad0 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
24ae0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
24af0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
24b00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
24b10 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
24b20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
24b30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
24b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24b50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
24b60 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
24b70 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
24b80 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
24b90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24ba0 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
24bb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
24bc0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24bd0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
24be0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
24bf0 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
24c00 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
24c10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24c20 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d  age]));.    rc =
24c30 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
24c40 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
24c50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24c60 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
24c70 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
24c80 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
24c90 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
24ca0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
24cb0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
24cc0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
24cd0 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
24ce0 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
24cf0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
24d00 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
24d10 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
24d20 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
24d30 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
24d40 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
24d50 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
24d60 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
24d70 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
24d80 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
24d90 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
24da0 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
24db0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
24dc0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
24dd0 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
24de0 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
24df0 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
24e00 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
24e10 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
24e20 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
24e30 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
24e40 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
24e50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
24e60 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
24e70 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24e80 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24e90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24ea0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24eb0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
24ec0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
24ed0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
24ee0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24ef0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
24f00 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
24f10 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
24f20 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
24f30 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
24f40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24f50 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
24f60 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
24f70 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
24f80 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
24f90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24fa0 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  OK ){.    pCur->
24fb0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24fc0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
24fd0 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l-1;.    pCur->i
24fe0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
24ff0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
25000 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
25010 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
25020 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
25030 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
25040 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
25050 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
25060 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
25070 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
25080 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
25090 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
250a0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
250b0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
250c0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
250d0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
250e0 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
250f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
25100 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
25110 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
25120 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25130 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25140 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25150 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
25160 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
25170 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
25180 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
25190 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
251a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
251b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
251c0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
251d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
251e0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
251f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25200 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25210 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
25220 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
25230 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
25240 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25250 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25260 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
25270 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
25280 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
25290 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
252a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
252b0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
252c0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
252d0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
252e0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
252f0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
25300 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
25310 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
25320 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
25330 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
25340 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
25350 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
25360 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
25370 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25380 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
25390 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
253a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
253b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
253c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
253d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
253e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
253f0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
25400 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
25410 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
25420 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
25430 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
25440 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
25450 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
25460 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
25470 53 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61  State && pCur->a
25480 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66 20  tLast ){.#ifdef 
25490 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
254a0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
254b0 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
254c0 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
254d0 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
254e0 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
254f0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
25500 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
25510 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
25520 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
25530 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
25540 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25550 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
25560 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
25570 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
25580 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
25590 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
255a0 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  Page]==pCur->apP
255b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
255c0 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
255d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
255e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
255f0 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
25600 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
25610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
25620 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
25630 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
25640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25650 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
25660 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
25670 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
25680 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
25690 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
256a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
256b0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
256c0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
256d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
256e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
256f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25700 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
25710 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
25720 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
25730 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
25740 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
25750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31  rc==SQLITE_OK ?1
25760 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  :0;.    }.  }.  
25770 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25780 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
25790 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
257a0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
257b0 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
257c0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
257d0 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
257e0 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
257f0 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
25800 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
25810 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
25820 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
25830 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
25840 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
25850 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
25860 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
25870 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
25880 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
25890 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
258a0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
258b0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
258c0 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
258d0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
258e0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
258f0 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
25900 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
25910 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
25920 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
25930 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
25940 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
25950 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
25960 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
25970 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
25980 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
25990 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
259a0 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
259b0 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
259c0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
259d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
259e0 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
259f0 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
25a00 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
25a10 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
25a20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
25a30 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
25a40 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
25a50 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
25a60 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
25a70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
25a80 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
25a90 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
25aa0 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
25ab0 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ad0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
25ae0 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
25af0 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
25b00 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
25b10 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
25b20 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
25b30 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
25b40 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
25b50 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
25b60 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
25b70 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
25b80 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
25b90 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
25ba0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
25bb0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
25bc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25bd0 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
25be0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
25bf0 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
25c00 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
25c10 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
25c20 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
25c30 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
25c40 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
25c50 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
25c60 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
25c70 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
25c80 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
25c90 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
25ca0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
25cb0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
25cc0 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
25cd0 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
25ce0 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
25cf0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
25d00 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
25d10 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
25d20 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
25d30 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
25d40 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
25d50 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
25d60 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
25d70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25d80 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
25d90 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
25da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
25db0 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
25dc0 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
25dd0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
25de0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
25df0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
25e00 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
25e10 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
25e20 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
25e30 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
25e40 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
25e50 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
25e60 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  rk */.  if( pCur
25e70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25e80 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e  _VALID && pCur->
25e90 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26  validNKey .   &&
25ea0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
25eb0 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  ->intKey .  ){. 
25ec0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
25ed0 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
25ee0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
25ef0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
25f00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
25f10 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
25f20 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69  tLast && pCur->i
25f30 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
25f40 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
25f50 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
25f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
25f70 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d   }.  }..  rc = m
25f80 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
25f90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
25fa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25fb0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25fc0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
25fd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25fe0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
25ff0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
26000 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
26010 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26020 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
26030 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26040 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
26050 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
26060 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26070 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
26080 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
26090 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
260a0 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
260b0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
260c0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
260d0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
260e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
260f0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
26100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26110 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
26120 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
26130 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
26140 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
26150 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
26160 75 70 72 2c 20 69 64 78 3b 0a 20 20 20 20 50 67  upr, idx;.    Pg
26170 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
26180 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
26190 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
261a0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
261b0 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50  nt c;..    /* pP
261c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
261d0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
261e0 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
261f0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
26200 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
26210 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
26220 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
26230 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
26240 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
26250 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
26260 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
26270 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
26280 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
26290 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
262a0 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
262b0 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
262c0 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
262d0 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
262e0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
262f0 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
26300 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
26310 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
26320 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
26330 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
26340 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
26350 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
26360 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
26370 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26380 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
26390 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
263a0 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
263b0 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
263c0 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
263d0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
263e0 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
263f0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  ){.      pCur->a
26400 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26410 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20  ] = (u16)(idx = 
26420 75 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  upr);.    }else{
26430 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
26440 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
26450 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20 28 75  = (u16)(idx = (u
26460 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20  pr+lwr)/2);.    
26470 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  }.    for(;;){. 
26480 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20       u8 *pCell; 
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
264b0 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63  ter to current c
264c0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
264d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
264e0 64 78 3d 3d 70 43 75 72 2d 3e 61 69 49 64 78 5b  dx==pCur->aiIdx[
264f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
26500 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
26510 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
26520 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
26530 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
26540 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
26550 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
26560 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
26570 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
26580 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  llKey;.        i
26590 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
265a0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
265b0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
265c0 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
265d0 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
265e0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
265f0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
26600 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
26610 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
26620 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
26630 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
26640 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
26650 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26660 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
26670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
26680 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
26690 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
266a0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  sert( nCellKey>i
266b0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
266c0 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20     c = +1;.     
266d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75     }.        pCu
266e0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
266f0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
26700 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
26710 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lKey;.      }els
26720 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
26730 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
26740 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
26750 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68   65536 bytes. Th
26760 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
26770 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
26780 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
26790 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
267a0 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
267b0 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
267c0 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68   page is less th
267d0 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61  an 16384 bytes a
267e0 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  nd may be stored
267f0 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
26800 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
26810 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
26820 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
26830 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
26840 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
26850 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
26860 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
26870 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
26880 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
26890 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
268a0 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
268b0 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
268c0 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
268d0 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
268e0 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
268f0 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
26900 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
26910 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b  t nCell = pCell[
26920 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
26930 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
26940 78 31 62 79 74 65 50 61 79 6c 6f 61 64 0a 20 20  x1bytePayload.  
26950 20 20 20 20 20 20 20 2f 2a 20 26 26 20 28 70 43         /* && (pC
26960 65 6c 6c 2b 6e 43 65 6c 6c 29 3c 70 50 61 67 65  ell+nCell)<pPage
26970 2d 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20 20  ->aDataEnd */.  
26980 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26990 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
269a0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
269b0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
269c0 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
269d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
269e0 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
269f0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
26a00 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
26a10 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
26a20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
26a30 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
26a40 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
26a50 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
26a60 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
26a70 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
26a80 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
26a90 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
26aa0 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
26ab0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
26ac0 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
26ad0 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
26ae0 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
26af0 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
26b00 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
26b10 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
26b20 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al.          /* 
26b30 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  && (pCell+nCell+
26b40 32 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  2)<=pPage->aData
26b50 45 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  End */.        )
26b60 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
26b70 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
26b80 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
26b90 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
26ba0 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
26bb0 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
26bc0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
26bd0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
26be0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
26bf0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
26c00 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
26c10 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
26c20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
26c30 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
26c40 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
26c50 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
26c60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26c70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26c80 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
26c90 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
26ca0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
26cb0 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
26cc0 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
26cd0 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
26ce0 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
26cf0 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
26d00 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
26d10 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
26d20 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
26d30 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
26d40 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
26d50 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
26d60 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
26d70 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
26d80 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  alled. */.      
26d90 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
26da0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
26db0 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
26dc0 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
26dd0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
26de0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  ;.          btre
26df0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
26e00 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
26e10 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
26e20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
26e30 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
26e40 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
26e50 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
26e60 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20  e3Malloc( nCell 
26e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26e80 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
26e90 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26ea0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26eb0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
26ec0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
26ed0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26ee0 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
26ef0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
26f00 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
26f10 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
26f20 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26f30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26f50 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
26f60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
26f70 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
26f80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26f90 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
26fa0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
26fb0 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79  (nCell, pCellKey
26fc0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
26fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26fe0 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
26ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27000 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
27010 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
27020 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
27030 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
27040 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
27050 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  dx;.          br
27060 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
27070 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
27080 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
27090 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
270a0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
270b0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
270c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
270d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
270e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
270f0 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d  = idx+1;.      }
27100 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70  else{.        up
27110 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
27120 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72   }.      if( lwr
27130 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >upr ){.        
27140 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27150 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
27160 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
27170 28 75 31 36 29 28 69 64 78 20 3d 20 28 6c 77 72  (u16)(idx = (lwr
27180 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +upr)/2);.    }.
27190 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
271a0 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
271b0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
271c0 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
271d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
271e0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
271f0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
27200 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
27210 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
27220 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
27230 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
27240 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
27250 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
27260 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
27270 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27280 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
27290 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
272a0 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
272b0 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67  }.    if( chldPg
272c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
272d0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
272e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
272f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27300 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
27310 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
27320 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
27330 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
27340 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
27350 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
27360 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27370 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
27380 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
27390 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
273a0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
273b0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
273c0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
273d0 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
273e0 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
273f0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
27400 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
27410 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
27420 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
27430 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
27440 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
27450 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
27460 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
27470 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
27480 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
27490 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
274a0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
274b0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
274c0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
274d0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
274e0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
274f0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
27500 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
27510 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
27520 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
27530 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
27540 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
27550 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
27560 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
27570 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
27580 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
27590 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
275a0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
275b0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
275c0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
275d0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
275e0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
275f0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
27600 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
27610 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
27620 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
27630 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
27640 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
27650 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
27660 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
27670 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
27680 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
27690 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
276a0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
276b0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
276c0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
276d0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
276e0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
276f0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
27700 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
27710 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
27720 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
27730 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27740 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
27750 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
27760 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
27770 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
27780 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
27790 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
277a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
277b0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
277c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
277d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
277e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
277f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
27800 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
27810 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
27820 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
27830 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
27840 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
27850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
27860 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
27870 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ext>0 ){.    pCu
27880 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
27890 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
278a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
278b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
278c0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
278d0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
278e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
278f0 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
27900 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27910 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
27920 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
27930 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
27940 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27950 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
27960 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
27970 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
27980 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
27990 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
279a0 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
279b0 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
279c0 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
279d0 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
279e0 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
279f0 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
27a00 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
27a10 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
27a20 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
27a30 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
27a40 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
27a50 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
27a60 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
27a70 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
27a80 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
27a90 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
27aa0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
27ab0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
27ac0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
27ad0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
27ae0 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
27af0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
27b00 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
27b10 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
27b20 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
27b30 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
27b40 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
27b50 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
27b60 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
27b70 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
27b80 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
27b90 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
27ba0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
27bb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
27bc0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
27bd0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
27be0 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
27bf0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
27c00 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
27c10 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
27c20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27c30 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
27c40 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
27c50 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
27c60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27c70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
27c80 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
27c90 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27ca0 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
27cb0 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
27cc0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
27cd0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
27ce0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27cf0 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
27d00 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
27d10 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
27d20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
27d30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
27d40 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
27d50 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
27d60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27d70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
27d80 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
27d90 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
27da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
27db0 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
27dc0 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
27dd0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
27de0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
27df0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
27e00 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
27e10 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
27e20 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
27e30 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
27e40 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
27e50 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
27e60 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
27e70 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
27e80 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
27e90 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
27ea0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
27eb0 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
27ec0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
27ed0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
27ee0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
27ef0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
27f00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
27f10 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
27f20 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
27f30 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
27f40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
27f60 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
27f70 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
27f80 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
27f90 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
27fa0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
27fb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
27fc0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
27fd0 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
27fe0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
27ff0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
28000 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
28010 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
28020 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
28030 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
28040 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28050 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
28060 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
28070 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
28080 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
28090 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
280a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
280b0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
280c0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
280d0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
280e0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
280f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
28100 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28110 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
28120 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
28130 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28140 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
28150 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
28160 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
28170 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
28180 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
28190 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
281a0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
281b0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
281c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
281d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
281e0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
281f0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
28200 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
28210 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
28220 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
28230 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
28240 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
28250 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
28260 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28270 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
28280 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
28290 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
282a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
282b0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
282c0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
282d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
282e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
282f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
28300 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
28310 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
28320 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
28330 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28340 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
28350 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
28360 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
28370 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
28380 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
28390 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
283a0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
283b0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
283c0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
283d0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
283e0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
283f0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
28400 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
28410 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
28420 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
28430 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
28440 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
28450 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
28460 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
28470 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
28480 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
28490 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
284a0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
284b0 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
284c0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
284d0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
284e0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
284f0 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
28500 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
28510 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
28520 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
28530 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
28540 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
28550 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
28560 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
28570 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
28580 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
28590 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
285a0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
285b0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
285c0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
285d0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
285e0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
285f0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
28600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
28610 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
28620 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
28630 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
28640 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
28650 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
28660 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
28670 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
28680 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
28690 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
286a0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
286b0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
286c0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
286d0 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
286e0 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
286f0 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
28700 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
28710 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
28720 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
28730 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
28740 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
28750 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
28760 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
28770 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
28780 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
28790 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
287a0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
287b0 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
287c0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
287d0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
287e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
287f0 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
28800 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
28810 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
28820 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
28830 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
28840 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
28850 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
28860 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
28870 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
28880 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
28890 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
288a0 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
288b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
288c0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
288d0 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
288e0 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
288f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
28900 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
28910 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
28920 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
28930 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
28940 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
28950 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
28960 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
28970 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
28980 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
28990 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
289a0 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
289b0 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
289c0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
289d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
289e0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
289f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
28a00 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
28a10 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
28a20 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
28a30 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
28a40 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
28a50 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
28a60 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
28a70 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
28a80 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
28a90 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
28aa0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
28ab0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
28ac0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
28ad0 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
28ae0 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
28af0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28b00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28b10 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
28b20 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
28b30 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
28b40 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
28b50 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
28b60 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
28b70 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
28b80 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
28b90 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
28ba0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
28bb0 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
28bc0 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
28bd0 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
28be0 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
28bf0 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
28c00 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
28c10 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
28c20 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
28c30 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
28c40 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
28c50 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
28c60 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
28c70 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
28c80 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
28c90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28ca0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
28cb0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
28cc0 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
28cd0 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
28ce0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
28cf0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
28d00 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
28d10 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
28d20 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
28d30 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
28d40 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
28d50 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
28d60 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
28d70 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
28d80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
28d90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
28da0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
28db0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
28dc0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
28dd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28de0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
28df0 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
28e00 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
28e10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
28e20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
28e30 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
28e40 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
28e50 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
28e60 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
28e70 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
28e80 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
28e90 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
28ea0 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
28eb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28ec0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
28ed0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
28ee0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
28ef0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
28f00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
28f10 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
28f20 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
28f30 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
28f40 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
28f50 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
28f60 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
28f70 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
28f80 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
28f90 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
28fa0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
28fb0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
28fc0 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
28fd0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
28fe0 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
28ff0 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
29000 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
29010 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
29020 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
29030 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
29040 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
29050 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
29060 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
29070 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
29080 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
29090 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
290a0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
290b0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
290c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
290d0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
290e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
290f0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
29100 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
29110 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
29120 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
29130 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
29140 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
29150 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
29160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29170 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
29180 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
29190 26 70 54 72 75 6e 6b 2c 20 30 2c 20 30 29 3b 0a  &pTrunk, 0, 0);.
291a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
291b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
291c0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
291d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
291e0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
291f0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
29200 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20  ( pTrunk!=0 );. 
29210 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
29220 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b  unk->aData!=0 );
29230 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
29240 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
29250 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f 66  ata[4]); /* # of
29260 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 73 20   leaves on this 
29270 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
29280 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
29290 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
292a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
292b0 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
292c0 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
292d0 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
292e0 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
292f0 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
29300 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
29310 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
29320 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
29330 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
29340 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
29350 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
29360 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
29370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
29380 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
29390 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
293a0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
293b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
293c0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
293d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
293e0 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
293f0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
29400 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
29410 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
29420 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
29430 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
29440 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
29450 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
29460 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
29470 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
29480 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
29490 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
294a0 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
294b0 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
294c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
294d0 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
294e0 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
294f0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
29500 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
29510 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
29520 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
29530 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
29540 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
29550 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
29560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
29570 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
29580 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
29590 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t .            &
295a0 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  & (nearby==iTrun
295b0 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61  k || (iTrunk<nea
295c0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
295d0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
295e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
295f0 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
29600 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
29610 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
29620 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
29630 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
29640 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
29650 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
29660 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
29670 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  */.        *pPgn
29680 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
29690 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
296a0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
296b0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
296c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
296d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
296e0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
296f0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
29700 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
29710 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
29720 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
29730 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
29740 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
29750 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
29760 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
29770 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
29780 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
29790 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
297a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
297b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
297c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
297d0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
297e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
297f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29800 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29810 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
29820 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
29830 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29840 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
29850 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
29860 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
29870 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
29880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
298a0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
298b0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
298c0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
298d0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
298e0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
298f0 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
29900 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
29910 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
29920 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
29930 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
29940 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
29950 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
29960 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
29970 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
29980 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
29990 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
299a0 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
299b0 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
299c0 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
299d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
299e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
299f0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
29a00 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
29a10 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
29a20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
29a30 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
29a40 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
29a50 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
29a60 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
29a70 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
29a80 75 6e 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unk, 0, 0);.    
29a90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29ab0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29ac0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
29ad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29af0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
29b00 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
29b10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29b20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29b30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
29b40 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
29b50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
29b60 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
29b70 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
29b80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
29b90 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
29ba0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
29bb0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
29bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
29bd0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
29be0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
29bf0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
29c00 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
29c10 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
29c20 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
29c30 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
29c40 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
29c50 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
29c60 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
29c70 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
29c80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29c90 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29ca0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
29cb0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
29cc0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
29cd0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
29ce0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
29cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29d00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29d10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
29d20 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
29d30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
29d40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
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 20 20 20 20 20 20 7d 0a 20 20              }.  
29d80 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
29d90 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
29da0 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
29db0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
29dc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29dd0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
29de0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
29df0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
29e00 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
29e10 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
29e20 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
29e30 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
29e40 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
29e50 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
29e60 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
29e70 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
29e80 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
29e90 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
29ea0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
29eb0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
29ec0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
29ed0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
29ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
29ef0 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
29f00 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
29f10 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
29f20 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
29f30 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
29f40 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
29f60 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
29f70 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
29f80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29f90 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
29fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29fb0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
29fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
29fd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
29fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29ff0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
2a000 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2a010 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
2a020 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
2a030 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
2a040 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
2a050 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2a060 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
2a070 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2a080 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
2a090 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2a0a0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2a0b0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
2a0c0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
2a0d0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
2a0e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a0f0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a110 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
2a120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2a150 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
2a160 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
2a170 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
2a180 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2a190 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2a1a0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
2a1b0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2a1c0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2a1d0 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
2a1e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2a1f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2a200 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2a210 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2a220 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a230 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2a240 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
2a250 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
2a260 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
2a270 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
2a280 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
2a290 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
2a2a0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2a2b0 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
2a2c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
2a2d0 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
2a2e0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
2a2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
2a300 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2a310 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
2a320 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
2a350 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
2a360 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
2a370 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
2a380 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
2a390 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
2a3a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a3b0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2a3c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2a3d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2a3e0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2a3f0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
2a400 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
2a410 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2a420 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
2a430 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
2a440 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
2a450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a460 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
2a470 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
2a480 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
2a490 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
2a4a0 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
2a4b0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
2a4c0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2a4d0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2a4e0 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 2c  Page, noContent,
2a4f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
2a500 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a520 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a530 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
2a540 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2a550 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2a560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a570 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
2a580 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2a590 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a5a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a5b0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2a5c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
2a5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
2a5e0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
2a5f0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
2a600 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
2a610 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
2a620 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
2a630 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2a640 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
2a650 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
2a660 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
2a670 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
2a680 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
2a690 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
2a6a0 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
2a6b0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
2a6c0 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
2a6d0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
2a6e0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
2a6f0 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
2a700 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
2a710 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
2a720 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
2a730 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
2a740 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
2a750 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
2a760 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
2a770 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
2a780 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
2a790 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
2a7a0 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
2a7b0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
2a7c0 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
2a7d0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
2a7e0 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
2a7f0 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
2a800 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
2a810 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
2a820 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2a830 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
2a840 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
2a850 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
2a860 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
2a870 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
2a880 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
2a890 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
2a8a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2a8b0 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
2a8c0 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
2a8d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
2a8e0 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
2a8f0 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
2a900 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
2a910 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
2a920 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
2a930 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
2a940 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
2a950 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
2a960 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
2a970 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
2a980 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
2a990 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
2a9a0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
2a9b0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
2a9c0 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
2a9d0 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
2a9e0 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
2a9f0 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
2aa00 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2aa10 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
2aa20 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2aa30 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
2aa40 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
2aa50 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
2aa60 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
2aa70 54 72 75 6e 63 61 74 65 29 29 3b 0a 0a 20 20 20  Truncate));..   
2aa80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2aa90 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
2aaa0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2aab0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2aac0 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
2aad0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
2aae0 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2aaf0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2ab00 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
2ab10 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
2ab20 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2ab30 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
2ab40 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
2ab50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2ab60 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
2ab70 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
2ab80 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
2ab90 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2aba0 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
2abb0 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
2abc0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2abd0 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
2abe0 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
2abf0 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
2ac00 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
2ac10 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
2ac20 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
2ac30 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
2ac40 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
2ac50 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
2ac60 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
2ac70 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2ac80 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2ac90 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
2aca0 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
2acb0 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
2acc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2acd0 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
2ace0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2acf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
2ad00 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2ad10 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
2ad20 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 2c 20 30 29  , bNoContent, 0)
2ad30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2ad40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ad50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ad60 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
2ad70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2ad80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2ad90 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
2ada0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2adb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74  rn rc;.      pBt
2adc0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
2add0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
2ade0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2adf0 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e  GE(pBt) ){ pBt->
2ae00 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d  nPage++; }.    }
2ae10 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34  .#endif.    put4
2ae20 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70  byte(28 + (u8*)p
2ae30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
2ae40 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  a, pBt->nPage);.
2ae50 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
2ae60 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73  ->nPage;..    as
2ae70 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
2ae80 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2ae90 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
2aea0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2aeb0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
2aec0 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 2c 20 30  e, bNoContent, 0
2aed0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2aee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2aef0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2af00 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2af10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2af20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2af30 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2af40 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2af50 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
2af60 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2af70 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
2af80 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
2af90 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
2afa0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2afb0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
2afc0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2afd0 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
2afe0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
2aff0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
2b000 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
2b010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b020 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
2b030 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
2b040 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2b050 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
2b060 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
2b070 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2b080 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b090 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
2b0a0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
2b0b0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2b0c0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
2b0d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
2b0e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
2b0f0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2b100 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d  eable((*ppPage)-
2b110 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
2b120 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b130 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2b140 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
2b150 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
2b160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b170 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
2b180 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2b190 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
2b1a0 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
2b1b0 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
2b1c0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
2b1d0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
2b1e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2b1f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2b200 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
2b210 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
2b220 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
2b230 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2b240 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
2b250 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2b260 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
2b270 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
2b280 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
2b290 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
2b2a0 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
2b2b0 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
2b2c0 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
2b2d0 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
2b2e0 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
2b2f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2b300 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
2b310 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
2b320 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
2b330 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
2b340 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
2b350 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
2b360 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
2b370 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
2b380 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
2b390 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
2b3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
2b3b0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2b3c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
2b3d0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
2b3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2b3f0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
2b400 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2b410 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
2b420 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
2b430 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
2b440 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
2b450 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
2b460 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
2b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b480 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
2b490 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
2b4a0 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b4d0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2b4e0 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
2b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b500 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2b510 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2b520 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
2b530 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2b540 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2b550 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2b560 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29  ssert( iPage>1 )
2b570 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
2b580 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
2b590 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
2b5a0 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  ;..  if( pMemPag
2b5b0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
2b5c0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
2b5d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
2b5e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2b5f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2b600 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
2b610 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
2b620 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
2b630 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
2b640 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
2b650 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
2b660 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b670 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2b680 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2b690 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2b6a0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
2b6b0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2b6c0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
2b6d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2b6e0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
2b6f0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
2b700 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
2b710 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
2b720 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
2b730 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
2b740 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2b750 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
2b760 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
2b770 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
2b780 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
2b790 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
2b7a0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
2b7b0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2b7c0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
2b7d0 20 30 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20   0, 0))!=0) ).  
2b7e0 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
2b7f0 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
2b800 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2b810 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
2b820 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
2b830 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2b840 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2b850 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
2b860 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
2b870 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
2b880 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2b890 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2b8a0 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
2b8b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
2b8c0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
2b8d0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
2b8e0 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
2b8f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
2b900 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2b910 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2b920 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
2b930 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
2b940 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2b950 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2b960 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
2b970 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
2b980 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
2b990 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
2b9a0 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
2b9b0 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
2b9c0 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
2b9d0 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
2b9e0 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
2b9f0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
2ba00 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2ba10 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
2ba20 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
2ba30 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
2ba40 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
2ba50 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2ba60 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
2ba70 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
2ba80 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
2ba90 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2baa0 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
2bab0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
2bac0 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
2bad0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
2bae0 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
2baf0 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
2bb00 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
2bb10 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
2bb20 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
2bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb40 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
2bb50 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
2bb60 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
2bb70 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2bb80 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2bb90 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
2bba0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2bbb0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2bbc0 54 72 75 6e 6b 2c 20 30 2c 20 30 29 3b 0a 20 20  Trunk, 0, 0);.  
2bbd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bbe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2bbf0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2bc00 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
2bc10 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2bc20 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
2bc30 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2bc40 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
2bc50 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
2bc60 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
2bc70 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
2bc80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2bc90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2bca0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2bcb0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2bcc0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
2bcd0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2bce0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
2bcf0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
2bd00 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
2bd10 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
2bd20 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
2bd30 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
2bd40 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
2bd50 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
2bd60 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
2bd70 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
2bd80 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
2bd90 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
2bda0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
2bdb0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2bdc0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
2bdd0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2bde0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
2bdf0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
2be00 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
2be10 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2be20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
2be30 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
2be40 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
2be50 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
2be60 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2be70 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
2be80 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
2be90 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2bea0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
2beb0 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
2bec0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
2bed0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
2bee0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
2bef0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
2bf00 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
2bf10 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
2bf20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
2bf30 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
2bf40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2bf50 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
2bf60 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
2bf70 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
2bf80 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
2bf90 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
2bfa0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
2bfb0 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
2bfc0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
2bfd0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
2bfe0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
2bff0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
2c000 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
2c010 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
2c020 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
2c030 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
2c040 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2c050 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c060 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2c070 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2c080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c090 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2c0a0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2c0b0 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
2c0c0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2c0d0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2c0e0 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
2c0f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2c100 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
2c110 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2c120 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
2c130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2c140 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2c150 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2c160 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2c170 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2c180 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
2c190 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
2c1a0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
2c1b0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2c1c0 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
2c1d0 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
2c1e0 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
2c1f0 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
2c200 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2c210 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2c220 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
2c230 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
2c240 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
2c250 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2c260 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
2c270 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
2c280 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
2c290 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
2c2a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2c2b0 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
2c2c0 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
2c2d0 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
2c2e0 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
2c2f0 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
2c300 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2c310 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
2c320 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
2c330 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2c340 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
2c350 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
2c360 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2c370 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
2c380 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
2c390 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
2c3a0 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
2c3b0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2c3c0 26 70 50 61 67 65 2c 20 30 2c 20 30 29 29 20 29  &pPage, 0, 0)) )
2c3d0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
2c3e0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
2c3f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c400 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2c410 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
2c420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c430 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2c440 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
2c450 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
2c460 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
2c470 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2c480 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
2c490 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2c4a0 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
2c4b0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
2c4c0 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
2c4d0 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
2c4e0 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
2c4f0 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
2c500 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
2c510 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
2c520 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
2c530 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
2c540 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2c550 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2c560 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
2c570 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
2c580 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
2c590 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2c5a0 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
2c5b0 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
2c5c0 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
2c5d0 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
2c5e0 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
2c5f0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
2c600 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
2c610 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2c620 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2c630 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
2c640 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
2c650 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
2c660 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
2c670 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
2c680 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2c690 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
2c6a0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
2c6b0 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
2c6c0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
2c6d0 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
2c6e0 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
2c6f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2c700 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2c710 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72  >mutex) );.  btr
2c720 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2c730 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2c740 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
2c750 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
2c760 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c770 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
2c780 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
2c790 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2c7a0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
2c7b0 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e  }.  if( pCell+in
2c7c0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e  fo.iOverflow+3 >
2c7d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50   pPage->aData+pP
2c7e0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b  age->maskPage ){
2c7f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c800 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2c810 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64    /* Cell extend
2c820 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61  s past end of pa
2c830 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ge */.  }.  ovfl
2c840 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
2c850 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
2c860 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
2c870 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
2c880 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
2c890 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
2c8a0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
2c8b0 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
2c8c0 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
2c8d0 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
2c8e0 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
2c8f0 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
2c900 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
2c910 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
2c920 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
2c930 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
2c940 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
2c950 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
2c960 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
2c970 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
2c980 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
2c990 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
2c9a0 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
2c9b0 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
2c9c0 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
2c9d0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
2c9e0 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
2c9f0 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
2ca00 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
2ca10 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
2ca20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
2ca30 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
2ca40 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
2ca50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2ca60 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2ca70 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
2ca80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
2ca90 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
2caa0 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
2cab0 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
2cac0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2cad0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2cae0 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
2caf0 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
2cb00 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2cb10 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
2cb20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
2cb30 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2cb40 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
2cb50 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
2cb60 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
2cb70 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
2cb80 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
2cb90 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
2cba0 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
2cbb0 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
2cbc0 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
2cbd0 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
2cbe0 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
2cbf0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
2cc00 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
2cc10 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
2cc20 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
2cc30 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
2cc40 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
2cc50 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
2cc60 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2cc70 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
2cc80 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2cc90 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
2cca0 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
2ccb0 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
2ccc0 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
2ccd0 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
2cce0 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
2ccf0 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
2cd00 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
2cd10 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
2cd20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
2cd30 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
2cd40 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
2cd50 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
2cd60 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
2cd70 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
2cd80 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
2cd90 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
2cda0 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
2cdb0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
2cdc0 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
2cdd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2cde0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2cdf0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
2ce00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
2ce10 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
2ce20 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
2ce30 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
2ce40 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
2ce50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
2ce60 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
2ce70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
2ce80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ce90 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
2cea0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
2ceb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2cec0 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
2ced0 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
2cee0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
2cef0 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
2cf00 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
2cf10 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
2cf20 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
2cf30 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
2cf40 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
2cf50 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
2cf60 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
2cf70 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
2cf80 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
2cf90 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
2cfa0 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
2cfb0 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
2cfc0 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
2cfd0 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
2cfe0 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
2cff0 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
2d000 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
2d010 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
2d020 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
2d030 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
2d040 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
2d050 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
2d060 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
2d070 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
2d080 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
2d090 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
2d0a0 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
2d0b0 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
2d0c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
2d0d0 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
2d0e0 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
2d0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d100 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
2d110 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
2d120 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2d130 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
2d140 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
2d150 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
2d160 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
2d170 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
2d180 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
2d190 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
2d1a0 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
2d1b0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
2d1c0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1e0 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
2d1f0 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
2d200 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
2d210 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
2d220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2d230 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
2d240 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
2d250 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
2d260 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
2d270 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
2d280 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
2d290 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
2d2a0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2d2b0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
2d2c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2d2d0 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
2d2e0 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
2d2f0 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
2d300 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2d310 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
2d320 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
2d330 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
2d340 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
2d350 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2d360 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2d370 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2d380 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
2d390 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
2d3a0 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
2d3b0 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
2d3c0 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
2d3d0 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
2d3e0 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
2d3f0 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
2d400 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
2d410 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
2d420 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
2d430 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2d440 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2d450 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2d460 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d470 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2d480 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2d490 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
2d4a0 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
2d4b0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2d4c0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2d4d0 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
2d4e0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
2d4f0 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
2d500 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
2d510 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74  l[nHeader], nDat
2d520 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73  a+nZero);.  }els
2d530 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e  e{.    nData = n
2d540 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Zero = 0;.  }.  
2d550 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
2d560 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
2d570 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
2d580 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ey);.  btreePars
2d590 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2d5a0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
2d5b0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
2d5c0 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
2d5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
2d5e0 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
2d5f0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
2d600 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61  ata==(u32)(nData
2d610 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20  +nZero) );.  .  
2d620 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
2d630 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
2d640 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
2d650 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
2d660 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
2d670 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2d680 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
2d690 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
2d6a0 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66    }else{ .    if
2d6b0 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37  ( NEVER(nKey>0x7
2d6c0 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d  fffffff || pKey=
2d6d0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  =0) ){.      ret
2d6e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2d6f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
2d700 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28     nPayload += (
2d710 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
2d720 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
2d730 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
2d740 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  .  }.  *pnSize =
2d750 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73   info.nSize;.  s
2d760 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e  paceLeft = info.
2d770 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f  nLocal;.  pPaylo
2d780 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
2d790 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d  der];.  pPrior =
2d7a0 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
2d7b0 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c  erflow];..  whil
2d7c0 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
2d7d0 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
2d7e0 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
2d7f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d800 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
2d810 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
2d820 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
2d830 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
2d840 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
2d850 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
2d860 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2d870 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
2d880 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
2d890 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
2d8a0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
2d8b0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
2d8c0 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
2d8d0 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
2d8e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2d8f0 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
2d900 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2d910 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2d920 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2d930 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
2d940 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
2d950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d960 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2d970 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
2d980 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2d990 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
2d9a0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
2d9b0 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
2d9c0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
2d9d0 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
2d9e0 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
2d9f0 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
2da00 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
2da10 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
2da20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
2da30 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
2da40 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
2da50 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
2da60 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
2da70 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
2da80 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
2da90 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
2daa0 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
2dab0 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
2dac0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
2dad0 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
2dae0 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
2daf0 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
2db00 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
2db10 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
2db20 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  he uninitialized
2db30 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
2db40 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
2db50 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
2db60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
2db70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2db80 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2db90 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
2dba0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
2dbb0 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
2dbc0 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
2dbd0 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
2dbe0 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
2dbf0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2dc00 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
2dc10 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
2dc20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2dc30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
2dc40 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
2dc50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2dc60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2dc70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2dc80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2dc90 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
2dca0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2dcb0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2dcc0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
2dcd0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
2dce0 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
2dcf0 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
2dd00 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
2dd10 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
2dd20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
2dd30 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2dd40 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
2dd50 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
2dd60 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
2dd70 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
2dd80 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
2dd90 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
2dda0 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
2ddb0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
2ddc0 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
2ddd0 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
2dde0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
2ddf0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
2de00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2de10 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
2de20 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
2de30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2de40 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2de50 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2de60 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2de70 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2de80 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
2de90 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
2dea0 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
2deb0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
2dec0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
2ded0 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
2dee0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
2def0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
2df00 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
2df10 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
2df20 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
2df30 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
2df40 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
2df50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2df60 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
2df70 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
2df80 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
2df90 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
2dfa0 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
2dfb0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
2dfc0 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
2dfd0 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
2dfe0 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
2dff0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
2e000 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
2e010 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
2e020 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
2e030 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2e040 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2e050 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2e060 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2e070 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
2e080 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
2e090 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2e0a0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2e0b0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2e0c0 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
2e0d0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
2e0e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2e0f0 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
2e100 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
2e110 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2e120 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2e130 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2e140 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2e150 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2e160 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
2e170 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
2e180 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
2e190 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
2e1a0 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
2e1b0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
2e1c0 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
2e1d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e1e0 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
2e1f0 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
2e200 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
2e210 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
2e220 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
2e230 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
2e240 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
2e250 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
2e260 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
2e270 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
2e280 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
2e290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2e2a0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
2e2b0 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
2e2c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2e2d0 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
2e2e0 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
2e2f0 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
2e300 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
2e310 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
2e320 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
2e330 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
2e340 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
2e350 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
2e360 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2e370 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
2e380 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
2e390 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
2e3a0 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
2e3b0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
2e3c0 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
2e3d0 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
2e3e0 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
2e3f0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
2e400 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
2e410 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
2e420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2e430 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c  int idx, int sz,
2e440 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33   int *pRC){.  u3
2e450 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  2 pc;         /*
2e460 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
2e470 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
2e480 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
2e490 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2e4a0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
2e4b0 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
2e4c0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2e4d0 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
2e4e0 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
2e4f0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50  [] */.  u8 *endP
2e500 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  tr;     /* End o
2e510 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
2e520 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
2e530 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2e540 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2e550 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
2e560 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
2e570 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
2e580 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
2e590 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2e5a0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2e5b0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
2e5c0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
2e5d0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2e5e0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
2e5f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2e600 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e610 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2e620 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2e630 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2e640 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2e650 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
2e660 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2e670 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
2e680 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
2e690 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
2e6a0 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
2e6b0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2e6c0 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
2e6d0 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
2e6e0 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
2e6f0 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
2e700 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2e710 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
2e720 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
2e730 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2e740 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
2e750 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2e760 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
2e770 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e780 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
2e790 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
2e7a0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
2e7b0 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
2e7c0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
2e7d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2e7e0 7d 0a 20 20 65 6e 64 50 74 72 20 3d 20 26 70 50  }.  endPtr = &pP
2e7f0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  age->aCellIdx[2*
2e800 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 32  pPage->nCell - 2
2e810 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  ];.  assert( (SQ
2e820 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
2e830 70 74 72 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f  ptr)&1)==0 );  /
2e840 2a 20 70 74 72 20 69 73 20 61 6c 77 61 79 73 20  * ptr is always 
2e850 32 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a  2-byte aligned *
2e860 2f 0a 20 20 77 68 69 6c 65 28 20 70 74 72 3c 65  /.  while( ptr<e
2e870 6e 64 50 74 72 20 29 7b 0a 20 20 20 20 2a 28 75  ndPtr ){.    *(u
2e880 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a  16*)ptr = *(u16*
2e890 29 26 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74  )&ptr[2];.    pt
2e8a0 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 50  r += 2;.  }.  pP
2e8b0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
2e8c0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2e8d0 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
2e8e0 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
2e8f0 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a  Free += 2;.}../*
2e900 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
2e910 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
2e920 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
2e930 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
2e940 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
2e950 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
2e960 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
2e970 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
2e980 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
2e990 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
2e9a0 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
2e9b0 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
2e9c0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
2e9d0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2e9e0 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
2e9f0 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
2ea00 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
2ea10 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
2ea20 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
2ea30 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66   in pPage->apOvf
2ea40 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
2ea50 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
2ea60 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
2ea70 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
2ea80 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
2ea90 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
2eaa0 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
2eab0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
2eac0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
2ead0 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
2eae0 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
2eaf0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
2eb00 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
2eb10 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
2eb20 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2eb30 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
2eb40 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
2eb50 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
2eb60 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2eb70 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
2eb80 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
2eb90 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
2eba0 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
2ebb0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
2ebc0 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
2ebd0 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
2ebe0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
2ebf0 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
2ec00 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
2ec10 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
2ec20 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
2ec30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2ec40 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
2ec50 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
2ec60 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
2ec70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2ec80 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
2ec90 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
2eca0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
2ecb0 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
2ecc0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2ecd0 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
2ece0 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
2ecf0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
2ed00 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
2ed10 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
2ed20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
2ed30 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
2ed40 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
2ed50 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
2ed60 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
2ed70 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
2ed80 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
2ed90 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
2eda0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
2edb0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
2edc0 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
2edd0 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
2ede0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
2edf0 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
2ee00 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
2ee10 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
2ee20 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
2ee30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2ee40 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2ee50 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
2ee60 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
2ee70 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
2ee80 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2ee90 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2eea0 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
2eeb0 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
2eec0 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
2eed0 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
2eee0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ted */.  int cel
2eef0 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
2ef00 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
2ef10 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
2ef20 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
2ef30 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
2ef40 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
2ef50 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
2ef60 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
2ef70 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
2ef80 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
2ef90 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
2efa0 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e  ta[] */.  u8 *en
2efb0 64 50 74 72 3b 20 20 20 20 20 20 20 2f 2a 20 45  dPtr;       /* E
2efc0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  nd of the loop *
2efd0 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d  /..  int nSkip =
2efe0 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30   (iChild ? 4 : 0
2eff0 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  );..  if( *pRC )
2f000 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
2f010 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
2f020 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
2f030 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
2f040 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2f050 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
2f060 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
2f070 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2f080 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
2f090 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2f0a0 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
2f0b0 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
2f0c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41  ) );.  assert( A
2f0d0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2f0e0 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69  apOvfl)==ArraySi
2f0f0 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  ze(pPage->aiOvfl
2f100 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2f110 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2f120 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2f130 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2f140 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
2f150 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
2f160 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
2f170 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
2f180 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
2f190 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2f1a0 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
2f1b0 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
2f1c0 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
2f1d0 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
2f1e0 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
2f1f0 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
2f200 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
2f210 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
2f220 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
2f230 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
2f240 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
2f250 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
2f260 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
2f270 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
2f280 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
2f290 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
2f2a0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2f2b0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2f2c0 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
2f2d0 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
2f2e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2f2f0 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2f300 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2f310 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2f320 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2f330 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2f340 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2f350 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2f360 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2f370 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2f380 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2f390 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2f3a0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
2f3b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
2f3c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2f3d0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
2f3e0 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
2f3f0 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
2f400 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
2f410 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
2f420 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
2f430 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
2f440 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  16)i;.  }else{. 
2f450 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
2f460 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2f470 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2f480 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
2f4a0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
2f4b0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2f4c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f4d0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2f4e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2f4f0 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
2f500 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
2f510 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
2f520 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
2f530 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
2f540 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
2f550 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20  >nCell;.    ins 
2f560 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2f570 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  *i;.    rc = all
2f580 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
2f590 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
2f5a0 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
2f5b0 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
2f5c0 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
2f5d0 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
2f5e0 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
2f5f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
2f600 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
2f610 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
2f620 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61  success */.    a
2f630 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e  ssert( idx >= en
2f640 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d+2 );.    asser
2f650 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e  t( idx+sz <= (in
2f660 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
2f670 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
2f680 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
2f690 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
2f6a0 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
2f6b0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
2f6c0 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
2f6d0 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
2f6e0 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20  nSkip);.    if( 
2f6f0 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
2f700 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69  put4byte(&data[i
2f710 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  dx], iChild);.  
2f720 20 20 7d 0a 20 20 20 20 70 74 72 20 3d 20 26 64    }.    ptr = &d
2f730 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20 20 65 6e  ata[end];.    en
2f740 64 50 74 72 20 3d 20 26 64 61 74 61 5b 69 6e 73  dPtr = &data[ins
2f750 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ];.    assert( (
2f760 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
2f770 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b 20  T(ptr)&1)==0 ); 
2f780 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61 79   /* ptr is alway
2f790 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 2-byte aligned
2f7a0 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
2f7b0 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a 20 20 20  tr>endPtr ){.   
2f7c0 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20     *(u16*)ptr = 
2f7d0 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d 32 5d 3b  *(u16*)&ptr[-2];
2f7e0 0a 20 20 20 20 20 20 70 74 72 20 2d 3d 20 32 3b  .      ptr -= 2;
2f7f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62  .    }.    put2b
2f800 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
2f810 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
2f820 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
2f830 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
2f840 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
2f850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f860 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2f870 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
2f880 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2f890 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
2f8a0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
2f8b0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
2f8c0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
2f8d0 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
2f8e0 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
2f8f0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2f900 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
2f910 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
2f920 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
2f930 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
2f940 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
2f950 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
2f960 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20  *.** Add a list 
2f970 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61  of cells to a pa
2f980 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68  ge.  The page sh
2f990 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c  ould be initiall
2f9a0 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20  y empty..** The 
2f9b0 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e  cells are guaran
2f9c0 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74  teed to fit on t
2f9d0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
2f9e0 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65  ic void assemble
2f9f0 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
2fa00 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65  *pPage,   /* The
2fa10 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65   page to be asse
2fa20 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mblied */.  int 
2fa30 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  nCell,        /*
2fa40 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
2fa50 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74  ells to add to t
2fa60 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
2fa70 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
2fa80 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63  /* Pointers to c
2fa90 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20  ell bodies */.  
2faa0 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20  u16 *aSize      
2fab0 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68    /* Sizes of th
2fac0 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  e cells */.){.  
2fad0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2fae0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2faf0 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  r */.  u8 *pCell
2fb00 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ptr;     /* Addr
2fb10 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
2fb20 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
2fb30 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20  t cellbody;     
2fb40 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
2fb50 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a  xt cell body */.
2fb60 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
2fb70 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2fb80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2fb90 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
2fba0 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20   for pPage */.  
2fbb0 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
2fbc0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2fbd0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
2fbe0 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
2fbf0 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  on pPage */.  co
2fc00 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20  nst int nUsable 
2fc10 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
2fc20 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61  ableSize; /* Usa
2fc30 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65  ble size of page
2fc40 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2fc50 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2fc60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2fc70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2fc80 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2fc90 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2fca0 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e  t( nCell>=0 && n
2fcb0 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45  Cell<=(int)MX_CE
2fcc0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 0a 20  LL(pPage->pBt). 
2fcd0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
2fce0 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  nt)MX_CELL(pPage
2fcf0 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a  ->pBt)<=10921);.
2fd00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2fd10 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2fd20 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2fd30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
2fd40 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68   that the page h
2fd50 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72  as just been zer
2fd60 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28  oed by zeroPage(
2fd70 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ) */.  assert( p
2fd80 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2fd90 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32  ;.  assert( get2
2fda0 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
2fdb0 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62  a[hdr+5])==nUsab
2fdc0 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74  le );..  pCellpt
2fdd0 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
2fde0 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  lIdx[nCell*2];. 
2fdf0 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61   cellbody = nUsa
2fe00 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65  ble;.  for(i=nCe
2fe10 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ll-1; i>=0; i--)
2fe20 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d 20 61  {.    u16 sz = a
2fe30 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65  Size[i];.    pCe
2fe40 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
2fe50 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a  cellbody -= sz;.
2fe60 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
2fe70 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29  llptr, cellbody)
2fe80 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2fe90 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
2fea0 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  Cell[i], sz);.  
2feb0 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
2fec0 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
2fed0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
2fee0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c  ata[hdr+5], cell
2fef0 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
2ff00 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a  nFree -= (nCell*
2ff10 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65  2 + nUsable - ce
2ff20 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2ff30 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
2ff40 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
2ff50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
2ff60 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
2ff70 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
2ff80 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
2ff90 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
2ffa0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2ffb0 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
2ffc0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
2ffd0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2ffe0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
2fff0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
30000 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
30010 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
30020 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
30030 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
30040 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
30050 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
30060 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
30070 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
30080 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
30090 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
300a0 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
300b0 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
300c0 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
300d0 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
300e0 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
300f0 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
30100 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
30110 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
30120 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
30130 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
30140 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
30150 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
30160 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
30170 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
30180 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
30190 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
301a0 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
301b0 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
301c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
301d0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
301e0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
301f0 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
30200 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
30210 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
30220 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
30230 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69   balance */...#i
30240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30250 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
30260 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
30270 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
30280 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
30290 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
302a0 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
302b0 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
302c0 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
302d0 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
302e0 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
302f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
30300 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
30310 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
30320 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
30330 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
30340 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
30350 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e   trying to balan
30360 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
30370 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
30380 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
30390 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
303a0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
303b0 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
303c0 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
303d0 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
303e0 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
303f0 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
30400 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
30410 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
30420 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
30430 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
30440 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
30450 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
30460 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
30470 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
30480 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
30490 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
304a0 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
304b0 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
304c0 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
304d0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
304e0 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
304f0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
30500 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
30510 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
30520 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
30530 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
30540 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
30550 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
30560 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
30570 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69   pSpace buffer i
30580 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
30590 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79  a temporary copy
305a0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a   of the divider.
305b0 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c  ** cell that wil
305c0 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
305d0 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68  to pParent. Such
305e0 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
305f0 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20   of a 4.** byte 
30600 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c  page number foll
30610 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62  owed by a variab
30620 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
30630 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  r. In other.** w
30640 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33  ords, at most 13
30650 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68   bytes. Hence th
30660 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
30670 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65  must be at.** le
30680 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20  ast 13 bytes in 
30690 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
306a0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
306b0 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  k(MemPage *pPare
306c0 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  nt, MemPage *pPa
306d0 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b  ge, u8 *pSpace){
306e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e  .  BtShared *con
306f0 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  st pBt = pPage->
30700 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65  pBt;    /* B-Tre
30710 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e Database */.  
30720 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20  MemPage *pNew;  
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30740 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
30750 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
30760 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
30770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30780 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30790 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   Code */.  Pgno 
307a0 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20  pgnoNew;        
307b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307c0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
307d0 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73  f pNew */..  ass
307e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
307f0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
30800 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
30810 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30820 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
30830 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
30840 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30850 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
30860 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  =1 );..  /* This
30870 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
30880 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
30890 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
308a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
308b0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  /.  if( pPage->n
308c0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
308d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
308e0 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  BKPT;..  /* Allo
308f0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
30900 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   This page will 
30910 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74  become the right
30920 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a  -sibling of .  *
30930 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68  * pPage. Make th
30940 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72  e parent page wr
30950 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20  itable, so that 
30960 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
30970 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65  cell.  ** may be
30980 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f   inserted. If bo
30990 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69  th these operati
309a0 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66  ons are successf
309b0 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a  ul, proceed..  *
309c0 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
309d0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
309e0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
309f0 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72   0, 0);..  if( r
30a00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30a10 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20  .    u8 *pOut = 
30a20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20  &pSpace[4];.    
30a30 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67  u8 *pCell = pPag
30a40 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20  e->apOvfl[0];.  
30a50 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63    u16 szCell = c
30a60 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
30a70 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38  , pCell);.    u8
30a80 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73   *pStop;..    as
30a90 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
30aa0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e  erIswriteable(pN
30ab0 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ew->pDbPage) );.
30ac0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30ad0 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54  e->aData[0]==(PT
30ae0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
30af0 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20  FDATA|PTF_LEAF) 
30b00 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
30b10 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59  pNew, PTF_INTKEY
30b20 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
30b30 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73  F_LEAF);.    ass
30b40 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
30b50 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
30b60 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ll);..    /* If 
30b70 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
30b80 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
30b90 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
30ba0 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77  ter map.    ** w
30bb0 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
30bc0 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
30bd0 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
30be0 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  om the .    ** c
30bf0 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
30c00 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
30c10 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f  age. If either o
30c20 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f  f these.    ** o
30c30 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c  perations fails,
30c40 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
30c50 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65   is set, but the
30c60 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a   contents.    **
30c70 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
30c80 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61  age are still ma
30c90 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68  nipulated by thh
30ca0 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20   code below..   
30cb0 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20   ** That is Ok, 
30cc0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  at this point th
30cd0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
30ce0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
30cf0 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
30d00 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e  as dirty. Return
30d10 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
30d20 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20  e will cause a. 
30d30 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20     ** rollback, 
30d40 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e  undoing any chan
30d50 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
30d60 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
30d70 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
30d80 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
30d90 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
30da0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
30db0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
30dc0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
30dd0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e     if( szCell>pN
30de0 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
30df0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
30e00 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
30e10 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  Cell, &rc);.    
30e20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
30e30 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
30e40 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
30e50 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
30e60 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
30e70 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
30e80 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
30e90 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
30ea0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
30eb0 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
30ec0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
30ed0 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
30ee0 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
30ef0 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
30f00 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
30f10 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
30f20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
30f30 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
30f40 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
30f50 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
30f60 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
30f70 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
30f80 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
30f90 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
30fa0 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
30fb0 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
30fc0 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
30fd0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
30fe0 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
30ff0 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
31000 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
31010 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
31020 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
31030 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
31040 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
31050 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
31060 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
31070 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
31080 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
31090 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
310a0 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
310b0 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
310c0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
310d0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
310e0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
310f0 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
31100 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
31110 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
31120 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
31130 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
31140 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
31150 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
31160 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
31170 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
31180 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
31190 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
311a0 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
311b0 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
311c0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
311d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
311e0 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
311f0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72  r cell into pPar
31200 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65  ent. */.    inse
31210 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
31220 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20  pParent->nCell, 
31230 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f  pSpace, (int)(pO
31240 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20  ut-pSpace),.    
31250 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50             0, pP
31260 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  age->pgno, &rc);
31270 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
31280 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
31290 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20  nter of pParent 
312a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
312b0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
312c0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
312d0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
312e0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
312f0 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
31300 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
31310 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
31320 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
31330 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31340 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
31350 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
31360 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
31370 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
31380 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69  .#if 0./*.** Thi
31390 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
313a0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61  not contribute a
313b0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f  nything to the o
313c0 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69  peration of SQLi
313d0 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d  te..** it is som
313e0 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64  etimes activated
313f0 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69   temporarily whi
31400 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64  le debugging cod
31410 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a  e responsible .*
31420 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f  * for setting po
31430 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
31440 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
31450 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
31460 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61  s(MemPage **apPa
31470 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  ge, int nPage){.
31480 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
31490 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20  r(i=0; i<nPage; 
314a0 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  i++){.    Pgno n
314b0 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20  ;.    u8 e;.    
314c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
314d0 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20   apPage[i];.    
314e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
314f0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20  pPage->pBt;.    
31500 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
31510 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f  sInit );..    fo
31520 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e  r(j=0; j<pPage->
31530 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nCell; j++){.   
31540 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
31550 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20  ;.      u8 *z;. 
31560 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66      .      z = f
31570 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a  indCell(pPage, j
31580 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  );.      btreePa
31590 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
315a0 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  , z, &info);.   
315b0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
315c0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
315d0 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
315e0 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f  4byte(&z[info.iO
315f0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
31600 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
31610 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b  , ovfl, &e, &n);
31620 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31630 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
31640 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  && e==PTRMAP_OVE
31650 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20  RFLOW1 );.      
31660 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
31670 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
31680 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
31690 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20   get4byte(z);.  
316a0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
316b0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
316c0 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
316d0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
316e0 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
316f0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
31700 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
31710 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
31720 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
31730 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
31740 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
31750 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
31760 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
31770 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
31780 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &n);.      asser
31790 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
317a0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
317b0 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  TREE );.    }.  
317c0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
317d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
317e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
317f0 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
31800 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
31810 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
31820 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
31830 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
31840 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
31850 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
31860 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
31870 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31880 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
31890 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
318a0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
318b0 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
318c0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
318d0 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
318e0 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
318f0 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
31900 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
31910 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
31920 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
31930 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
31940 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
31950 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
31960 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
31970 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
31980 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
31990 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
319a0 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
319b0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
319c0 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
319d0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66  ** MemPage.apOvf
319e0 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
319f0 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
31a00 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
31a10 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
31a20 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
31a30 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
31a40 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
31a50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66  ..**.** The perf
31a60 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20  ormance of this 
31a70 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
31a80 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20  critical. It is 
31a90 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a  only used by .**
31aa0 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61   the balance_sha
31ab0 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c  llower() and bal
31ac0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72  ance_deeper() pr
31ad0 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65  ocedures, neithe
31ae0 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72  r of.** which ar
31af0 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75  e called often u
31b00 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63  nder normal circ
31b10 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74  umstances..*/.st
31b20 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f  atic void copyNo
31b30 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67  deContent(MemPag
31b40 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67  e *pFrom, MemPag
31b50 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43  e *pTo, int *pRC
31b60 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
31b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31b80 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e    BtShared * con
31b90 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e  st pBt = pFrom->
31ba0 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f  pBt;.    u8 * co
31bb0 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f  nst aFrom = pFro
31bc0 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38  m->aData;.    u8
31bd0 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70   * const aTo = p
31be0 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  To->aData;.    i
31bf0 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64  nt const iFromHd
31c00 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66  r = pFrom->hdrOf
31c10 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f  fset;.    int co
31c20 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70  nst iToHdr = ((p
31c30 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31  To->pgno==1) ? 1
31c40 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  00 : 0);.    int
31c50 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61   rc;.    int iDa
31c60 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73  ta;.  .  .    as
31c70 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49  sert( pFrom->isI
31c80 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nit );.    asser
31c90 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e  t( pFrom->nFree>
31ca0 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61  =iToHdr );.    a
31cb0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
31cc0 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
31cd0 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  5]) <= (int)pBt-
31ce0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
31cf0 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68   .    /* Copy th
31d00 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f  e b-tree node co
31d10 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20  ntent from page 
31d20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
31d30 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20  o. */.    iData 
31d40 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
31d50 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
31d60 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b      memcpy(&aTo[
31d70 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
31d80 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
31d90 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
31da0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
31db0 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
31dc0 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
31dd0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
31de0 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pFrom->nCell);. 
31df0 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69   .    /* Reiniti
31e00 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
31e10 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
31e20 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
31e30 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  ge structure.   
31e40 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
31e50 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
31e60 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
31e70 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66  o can actually f
31e80 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a  ail under.    **
31e90 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
31ea0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65  circumstances, e
31eb0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
31ec0 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69   a copy of initi
31ed0 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70  alized .    ** p
31ee0 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a  age pFrom..    *
31ef0 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69  /.    pTo->isIni
31f00 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
31f10 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54  btreeInitPage(pT
31f20 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
31f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31f40 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
31f50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
31f60 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
31f70 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
31f80 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
31f90 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
31fa0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
31fb0 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d     ** for any b-
31fc0 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
31fd0 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
31fe0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
31ff0 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20   pointers to..  
32000 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
32010 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
32020 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69     *pRC = setChi
32030 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
32040 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
32050 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
32060 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65  redistributes ce
32070 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65  lls on the iPare
32080 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f  ntIdx'th child o
32090 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65  f pParent.** (he
320a0 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67  reafter "the pag
320b0 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20  e") and up to 2 
320c0 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74  siblings so that
320d0 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
320e0 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d  about the.** sam
320f0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
32100 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20   space. Usually 
32110 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67  a single sibling
32120 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
32130 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61  of the.** page a
32140 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  re used in the b
32150 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68  alancing, though
32160 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d   both siblings m
32170 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
32180 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68  ne.** side if th
32190 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69  e page is the fi
321a0 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  rst or last chil
321b0 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
321c0 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a   If the page .**
321d0 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
321e0 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65  2 siblings (some
321f0 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
32200 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
32210 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20  he page.** is a 
32220 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63  root page or a c
32230 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70  hild of a root p
32240 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  age) then all av
32250 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
32260 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20  .** participate 
32270 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
32280 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
32290 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
322a0 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74  f the page might
322b0 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
322c0 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a   decreased by .*
322d0 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20  * one or two in 
322e0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
322f0 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
32300 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
32310 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f   full. .**.** No
32320 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
32330 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
32340 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
32350 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
32360 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
32370 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
32380 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44  ed in MemPage.aD
32390 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20  ata[]. This can 
323a0 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
323b0 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
323c0 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  l. This routine 
323d0 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c  ensures that all
323e0 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64   cells allocated
323f0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
32400 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
32410 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67   fit into MemPag
32420 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65  e.aData[] before
32430 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
32440 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
32450 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
32460 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
32470 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61  blings, cells ma
32480 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  y be.** inserted
32490 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64   into or removed
324a0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
324b0 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e   page (pParent).
324c0 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79   Doing so.** may
324d0 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e   cause the paren
324e0 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65  t page to become
324f0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
32500 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a  erfull. If this.
32510 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  ** happens, it i
32520 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
32530 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
32540 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  er to invoke the
32550 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61   correct.** bala
32560 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f  ncing routine to
32570 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65   fix this proble
32580 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e  m (see the balan
32590 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a  ce() routine). .
325a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
325b0 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
325c0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
325d0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
325e0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
325f0 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
32600 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
32610 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
32620 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
32630 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
32640 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72  ..**.** The thir
32650 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
32660 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76  is function, aOv
32670 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f  flSpace, is a po
32680 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75  inter to a.** bu
32690 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20  ffer big enough 
326a0 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65  to hold one page
326b0 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72  . If while inser
326c0 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
326d0 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
326e0 67 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65  ge (pParent) the
326f0 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
32700 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
32710 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  his buffer is.**
32720 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
32730 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72  he parent's over
32740 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
32750 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
32760 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
32770 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
32780 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
32790 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
327a0 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
327b0 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
327c0 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
327d0 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
327e0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
327f0 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
32800 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
32810 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
32820 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
32830 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
32840 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
32850 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
32860 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
32870 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
32880 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
32890 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
328a0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
328b0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69  ITE_NOMEM..*/.#i
328c0 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  f defined(_MSC_V
328d0 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 20  ER) && _MSC_VER 
328e0 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66 69 6e  >= 1700 && defin
328f0 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67  ed(_M_ARM).#prag
32900 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20  ma optimize("", 
32910 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  off).#endif.stat
32920 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
32930 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67  onroot(.  MemPag
32940 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
32950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
32960 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c  ent page of sibl
32970 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ings being balan
32980 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ced */.  int iPa
32990 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20  rentIdx,        
329a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
329b0 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20  x of "the page" 
329c0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
329d0 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20  u8 *aOvflSpace, 
329e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329f0 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74  /* page-size byt
32a00 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
32a10 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20  parent ovfl */. 
32a20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20 20 20   int isRoot,    
32a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a40 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
32a50 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  ent is a root-pa
32a60 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c  ge */.  int bBul
32a70 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k               
32a80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
32a90 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
32aa0 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c  part of a bulk l
32ab0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  oad */.){.  BtSh
32ac0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
32ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32ae0 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
32af0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
32b00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
32b10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
32b20 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
32b30 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
32b40 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
32b50 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
32b60 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
32b70 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
32b80 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
32b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ba0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
32bb0 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
32bc0 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32be0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
32bf0 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
32c00 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
32c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
32c30 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
32c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c50 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
32c60 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
32c70 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
32c80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32c90 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
32ca0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
32cb0 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f   */.  u16 leafCo
32cc0 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
32cd0 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
32ce0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
32cf0 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
32d00 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
32d10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
32d20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
32d30 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
32d40 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
32d50 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
32d60 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
32d70 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
32d80 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
32d90 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
32da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32db0 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
32dc0 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
32dd0 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
32de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
32df0 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
32e00 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
32e10 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
32e20 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
32e30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
32e40 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
32e50 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
32e60 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20  nt iOvflSpace = 
32e70 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
32e80 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
32e90 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d   of aOvflSpace[]
32ea0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
32eb0 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
32ec0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
32ed0 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
32ee0 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
32ef0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
32f00 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
32f10 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
32f20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65  siblings */.  Me
32f30 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
32f40 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
32f50 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
32f60 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
32f70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
32f80 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
32f90 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
32fa0 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
32fb0 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
32fc0 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20  /.  u8 *pRight; 
32fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fe0 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20   /* Location in 
32ff0 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d  parent of right-
33000 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20  sibling pointer 
33010 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
33020 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B-1];           
33030 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
33040 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
33050 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
33060 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
33070 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
33080 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
33090 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
330a0 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
330b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
330c0 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
330d0 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
330e0 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
330f0 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
33100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33110 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
33120 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
33130 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
33140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
33150 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
33160 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
33170 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
33180 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  e1;             
33190 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
331a0 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64   copies of divid
331b0 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50  ers cells */.  P
331c0 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
331d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
331e0 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65  emp var to store
331f0 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69   a page number i
33200 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  n */..  pBt = pP
33210 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73  arent->pBt;.  as
33220 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
33230 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
33240 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
33250 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
33260 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
33270 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
33280 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22  #if 0.  TRACE(("
33290 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
332a0 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
332b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
332c0 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
332d0 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  o));.#endif..  /
332e0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
332f0 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65  pParent may have
33300 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65   at most one ove
33310 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20  rflow cell. And 
33320 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65  if.  ** this ove
33330 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72  rflow cell is pr
33340 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62  esent, it must b
33350 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  e the cell with 
33360 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72  .  ** index iPar
33370 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65  entIdx. This sce
33380 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75  nario comes abou
33390 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
333a0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c  tion.  ** is cal
333b0 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29  led (indirectly)
333c0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
333d0 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f  eeDelete()..  */
333e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
333f0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
33400 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
33410 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
33420 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
33430 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
33440 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b  pParent->aiOvfl[
33450 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29  0]==iParentIdx )
33460 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53  ;..  if( !aOvflS
33470 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75  pace ){.    retu
33480 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
33490 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
334a0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
334b0 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c  s to balance. Al
334c0 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65  so locate the ce
334d0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a  lls in pParent .
334e0 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65    ** that divide
334f0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41   the siblings. A
33500 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
33510 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
33520 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65  lings on .  ** e
33530 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
33540 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e  age. More siblin
33550 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
33560 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
33570 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68  ver, .  ** if th
33580 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
33590 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
335a0 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
335b0 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a  . If pParent.  *
335c0 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
335d0 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
335e0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
335f0 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
33600 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
33610 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72  his loop also dr
33620 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20  ops the divider 
33630 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70  cells from the p
33640 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73  arent page. This
33650 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72  .  ** way, the r
33660 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
33670 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
33680 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77  t have to deal w
33690 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65  ith any.  ** ove
336a0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74  rflow cells in t
336b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
336c0 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69  since if any exi
336d0 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20  sted they will. 
336e0 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79   ** have already
336f0 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20   been removed.. 
33700 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e   */.  i = pParen
33710 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70  t->nOverflow + p
33720 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20  Parent->nCell;. 
33730 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20   if( i<2 ){.    
33740 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  nxDiv = 0;.  }el
33750 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
33760 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c  bBulk==0 || bBul
33770 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  k==1 );.    if( 
33780 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b  iParentIdx==0 ){
33790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337a0 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20   .      nxDiv = 
337b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
337c0 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29   iParentIdx==i )
337d0 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
337e0 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d  i-2+bBulk;.    }
337f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
33800 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a  rt( bBulk==0 );.
33810 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50        nxDiv = iP
33820 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20  arentIdx-1;.    
33830 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62 42 75 6c  }.    i = 2-bBul
33840 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20  k;.  }.  nOld = 
33850 69 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78  i+1;.  if( (i+nx
33860 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
33870 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
33880 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
33890 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
338a0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
338b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
338c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
338d0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
338e0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
338f0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
33900 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
33910 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
33920 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
33930 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
33940 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
33950 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30  no, &apOld[i], 0
33960 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
33970 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70  .      memset(ap
33980 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69  Old, 0, (i+1)*si
33990 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b  zeof(MemPage*));
339a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  .      goto bala
339b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
339c0 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73   }.    nMaxCells
339d0 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
339e0 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
339f0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
33a00 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72  f( (i--)==0 ) br
33a10 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b  eak;..    if( i+
33a20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
33a30 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70 50 61  aiOvfl[0] && pPa
33a40 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
33a50 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
33a60 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f  ] = pParent->apO
33a70 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67  vfl[0];.      pg
33a80 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
33a90 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
33aa0 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
33ab0 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
33ac0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
33ad0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
33ae0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ow = 0;.    }els
33af0 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  e{.      apDiv[i
33b00 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ] = findCell(pPa
33b10 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
33b20 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
33b30 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  );.      pgno = 
33b40 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
33b50 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b  ]);.      szNew[
33b60 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
33b70 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
33b80 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  i]);..      /* D
33b90 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f  rop the cell fro
33ba0 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
33bb0 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c  e. apDiv[i] stil
33bc0 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20  l points to.    
33bd0 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69    ** the cell wi
33be0 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c  thin the parent,
33bf0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
33c00 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64  has been dropped
33c10 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
33c20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20  is safe because 
33c30 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20  dropping a cell 
33c40 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20  only overwrites 
33c50 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
33c60 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  ** four bytes of
33c70 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75   it, and this fu
33c80 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
33c90 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20  need the first. 
33ca0 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
33cb0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
33cc0 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70  r cell. So the p
33cd0 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74  ointer is safe t
33ce0 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c  o use.      ** l
33cf0 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20  ater on.  .     
33d00 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74   **.      ** But
33d10 20 6e 6f 74 20 69 66 20 77 65 20 61 72 65 20 69   not if we are i
33d20 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
33d30 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75 72 65 2d  mode. In secure-
33d40 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20  delete mode,.   
33d50 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
33d60 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
33d70 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
33d80 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
33d90 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
33da0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
33db0 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
33dc0 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
33dd0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
33de0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
33df0 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
33e00 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
33e10 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
33e20 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
33e30 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
33e40 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
33e50 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
33e60 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
33e70 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  TE ){.        in
33e80 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20  t iOff;..       
33e90 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50   iOff = SQLITE_P
33ea0 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b  TR_TO_INT(apDiv[
33eb0 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52  i]) - SQLITE_PTR
33ec0 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d  _TO_INT(pParent-
33ed0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
33ee0 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77   if( (iOff+szNew
33ef0 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75  [i])>(int)pBt->u
33f00 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
33f10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
33f20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33f30 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
33f40 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31  t(apOld, 0, (i+1
33f50 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  )*sizeof(MemPage
33f60 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  *));.          g
33f70 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
33f80 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  nup;.        }el
33f90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
33fa0 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65  mcpy(&aOvflSpace
33fb0 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d  [iOff], apDiv[i]
33fc0 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  , szNew[i]);.   
33fd0 20 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20         apDiv[i] 
33fe0 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70  = &aOvflSpace[ap
33ff0 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e  Div[i]-pParent->
34000 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20  aData];.        
34010 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
34020 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
34030 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
34040 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a  t->nOverflow, sz
34050 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  New[i], &rc);.  
34060 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
34070 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d  ke nMaxCells a m
34080 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20  ultiple of 4 in 
34090 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76  order to preserv
340a0 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c  e 8-byte.  ** al
340b0 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61  ignment */.  nMa
340c0 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65  xCells = (nMaxCe
340d0 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20  lls + 3)&~3;..  
340e0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
340f0 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
34100 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a  y structures.  *
34110 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67  /.  k = pBt->pag
34120 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73  eSize + ROUND8(s
34130 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
34140 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20  .  szScratch =. 
34150 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
34160 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
34170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34180 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
34190 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
341a0 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20  sizeof(u16)     
341b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341c0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
341d0 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53      + pBt->pageS
341e0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
341f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34200 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a    /* aSpace1 */.
34210 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20       + k*nOld;  
34220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34240 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65     /* Page copie
34250 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20  s (apCopy) */.  
34260 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
34270 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73  ScratchMalloc( s
34280 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69  zScratch ); .  i
34290 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
342a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
342b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
342c0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
342d0 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
342e0 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (u16*)&apCell[nM
342f0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61  axCells];.  aSpa
34300 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65  ce1 = (u8*)&szCe
34310 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
34320 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
34330 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53  YTE_ALIGNMENT(aS
34340 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a  pace1) );..  /*.
34350 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
34360 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
34370 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
34380 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
34390 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
343a0 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
343b0 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
343c0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
343d0 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
343e0 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  * into space obt
343f0 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63  ained from aSpac
34400 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20  e1[] and remove 
34410 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
34420 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
34430 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
34440 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
34450 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
34460 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
34470 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
34480 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
34490 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
344a0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
344b0 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
344c0 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
344d0 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20   aSpace1[].  In 
344e0 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
344f0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
34500 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
34510 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
34520 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
34530 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
34540 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
34550 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
34560 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
34570 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
34580 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
34590 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
345a0 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
345b0 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
345c0 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
345d0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
345e0 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
345f0 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
34600 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
34610 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
34620 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
34630 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
34640 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72  .  */.  leafCorr
34650 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30  ection = apOld[0
34660 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  ]->leaf*4;.  lea
34670 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d  fData = apOld[0]
34680 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
34690 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
346a0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
346b0 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
346c0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
346d0 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
346e0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
346f0 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
34700 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
34710 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
34720 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
34730 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
34740 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
34750 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
34760 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
34770 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
34780 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
34790 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
347a0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
347b0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
347c0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
347d0 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
347e0 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
347f0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
34800 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
34810 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
34820 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
34830 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
34840 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
34850 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
34860 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
34870 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
34880 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
34890 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
348a0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
348b0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 4f  flow;.    if( pO
348c0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ld->nOverflow>0 
348d0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
348e0 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
348f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34900 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
34910 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65   );.        apCe
34920 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
34930 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
34940 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  d, j);.        s
34950 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
34960 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
34970 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
34980 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
34990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
349a0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  lse{.      u8 *a
349b0 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61  Data = pOld->aDa
349c0 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20 6d 61  ta;.      u16 ma
349d0 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d  skPage = pOld->m
349e0 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20 20 75  askPage;.      u
349f0 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  16 cellOffset = 
34a00 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  pOld->cellOffset
34a10 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
34a20 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
34a30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34a40 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
34a50 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
34a60 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43  l[nCell] = findC
34a70 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d 61 73  ellv2(aData, mas
34a80 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65  kPage, cellOffse
34a90 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  t, j);.        s
34aa0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
34ab0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
34ac0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
34ad0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
34ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
34af0 20 20 20 20 20 20 0a 20 20 20 20 69 66 28 20 69        .    if( i
34b00 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66  <nOld-1 && !leaf
34b10 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36  Data){.      u16
34b20 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77   sz = (u16)szNew
34b30 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  [i];.      u8 *p
34b40 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  Temp;.      asse
34b50 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
34b60 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  lls );.      szC
34b70 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
34b80 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
34b90 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
34ba0 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20  ;.      iSpace1 
34bb0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
34bc0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61  ert( sz<=pBt->ma
34bd0 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20  xLocal+23 );.   
34be0 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
34bf0 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  e1 <= (int)pBt->
34c00 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
34c10 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
34c20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
34c30 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
34c40 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
34c50 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
34c60 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
34c70 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
34c80 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
34c90 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
34ca0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
34cb0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
34cc0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
34cd0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
34ce0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
34cf0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
34d00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
34d10 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
34d20 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
34d30 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
34d40 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
34d50 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
34d60 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
34d70 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
34d80 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
34d90 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
34da0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
34db0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
34dc0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
34dd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34de0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
34df0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
34e00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
34e10 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
34e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
34e30 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
34e40 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
34e50 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
34e60 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
34e70 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
34e80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34e90 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
34ea0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
34eb0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
34ec0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
34ed0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
34ee0 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
34ef0 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
34f00 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
34f10 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
34f20 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
34f30 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
34f40 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
34f50 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
34f60 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
34f70 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
34f80 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
34f90 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
34fa0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
34fb0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
34fc0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
34fd0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
34fe0 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
34ff0 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
35000 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
35010 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
35020 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
35030 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
35040 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
35050 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
35060 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
35070 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
35080 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
35090 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
350a0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
350b0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
350c0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
350d0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
350e0 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
350f0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
35100 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
35110 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
35120 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
35130 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
35140 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
35150 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
35160 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
35170 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
35180 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
35190 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
351a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
351b0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
351c0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
351d0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
351e0 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
351f0 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
35200 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
35210 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
35220 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
35230 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
35240 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
35250 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
35260 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
35270 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
35280 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
35290 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
352a0 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62  UPT_BKPT; goto b
352b0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
352c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
352d0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
352e0 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
352f0 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
35300 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
35310 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
35320 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
35330 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
35340 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
35350 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
35360 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
35370 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
35380 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
35390 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
353a0 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
353b0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
353c0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
353d0 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
353e0 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
353f0 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
35400 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
35410 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
35420 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
35430 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
35440 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
35450 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
35460 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
35470 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
35480 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
35490 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
354a0 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
354b0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
354c0 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
354d0 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
354e0 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
354f0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
35500 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
35510 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
35520 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
35530 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
35540 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
35550 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
35560 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
35570 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
35580 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
35590 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
355a0 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
355b0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
355c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
355d0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
355e0 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
355f0 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
35600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
35610 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
35620 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
35630 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
35640 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
35650 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
35660 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
35670 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
35680 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
35690 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
356a0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
356b0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
356c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21 62 42   .       || (!bB
356d0 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74 2b 73  ulk && szRight+s
356e0 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
356f0 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
35700 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
35710 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
35720 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
35730 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
35740 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
35750 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
35760 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
35770 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
35780 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
35790 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
357a0 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
357b0 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
357c0 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
357d0 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
357e0 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
357f0 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
35800 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20  0])>0) or pPage 
35810 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  is.  ** a virtua
35820 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
35830 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
35840 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
35850 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
35860 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
35870 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
35880 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
35890 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 50  ge..  **.  ** UP
358a0 44 41 54 45 3a 20 20 54 68 65 20 61 73 73 65 72  DATE:  The asser
358b0 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e 6f 74  t() below is not
358c0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75   necessarily tru
358d0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
358e0 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 63  e.  ** file is c
358f0 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63 6f 72  orrupt.  The cor
35900 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruption will be 
35910 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65 70  detected and rep
35920 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20 2a 2a  orted later.  **
35930 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75   in this procedu
35940 72 65 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  re so there is n
35950 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20 75 70  o need to act up
35960 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  on it now..  */.
35970 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
35980 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
35990 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
359a0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
359b0 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64 69 66  ll==0) );.#endif
359c0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
359d0 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
359e0 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
359f0 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
35a00 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
35a10 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
35a20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
35a30 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
35a40 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
35a50 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
35a60 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
35a70 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
35a80 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
35a90 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
35aa0 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
35ab0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35ac0 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  KPT;.    goto ba
35ad0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
35ae0 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d   }.  pageFlags =
35af0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61   apOld[0]->aData
35b00 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
35b10 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
35b20 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
35b30 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
35b40 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
35b50 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
35b60 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
35b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
35b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
35b90 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
35ba0 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
35bb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
35bc0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
35bd0 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
35be0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
35bf0 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
35c00 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
35c10 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
35c20 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f 20 31  pgno, (bBulk ? 1
35c30 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a 20 20   : pgno), 0);.  
35c40 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
35c50 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
35c60 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
35c70 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
35c80 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  nNew++;..      /
35c90 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
35ca0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
35cb0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
35cc0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  page. */.      i
35cd0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
35ce0 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
35cf0 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
35d00 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
35d10 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
35d20 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
35d30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35d40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
35d50 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
35d60 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
35d70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
35d80 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
35d90 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
35da0 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
35db0 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
35dc0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
35dd0 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61  ld ){.    freePa
35de0 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63  ge(apOld[i], &rc
35df0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
35e00 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
35e10 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
35e20 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
35e30 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
35e40 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
35e50 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
35e60 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
35e70 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
35e80 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
35e90 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
35ea0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
35eb0 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
35ec0 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
35ed0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
35ee0 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
35ef0 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
35f00 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
35f10 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
35f20 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
35f30 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
35f40 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
35f50 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
35f60 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
35f70 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
35f80 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
35f90 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
35fa0 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
35fb0 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
35fc0 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
35fd0 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
35fe0 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
35ff0 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
36000 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
36010 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
36020 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
36030 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
36040 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
36050 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
36060 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
36070 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
36080 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
36090 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69  t minV = apNew[i
360a0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74  ]->pgno;.    int
360b0 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
360c0 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
360d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
360e0 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75  pNew[j]->pgno<(u
360f0 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
36100 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
36110 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
36120 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b   apNew[j]->pgno;
36130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36140 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
36150 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
36160 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  pT;.      pT = a
36170 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pNew[i];.      a
36180 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
36190 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
361a0 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
361b0 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
361c0 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25  (("new: %d(%d) %
361d0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
361e0 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
361f0 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e     apNew[0]->pgn
36200 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  o, szNew[0],.   
36210 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77   nNew>=2 ? apNew
36220 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [1]->pgno : 0, n
36230 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
36240 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
36250 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70  =3 ? apNew[2]->p
36260 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  gno : 0, nNew>=3
36270 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
36280 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61  .    nNew>=4 ? a
36290 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[3]->pgno : 
362a0 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
362b0 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
362c0 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34  New>=5 ? apNew[4
362d0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
362e0 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
362f0 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  : 0));..  assert
36300 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
36310 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
36320 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
36330 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74   put4byte(pRight
36340 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
36350 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20  >pgno);..  /*.  
36360 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
36370 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
36380 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
36390 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
363a0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
363b0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
363c0 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
363d0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
363e0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
363f0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
36400 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
36410 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
36420 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
36430 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
36440 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
36450 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
36460 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
36470 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
36480 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
36490 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
364a0 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
364b0 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
364c0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
364d0 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
364e0 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
364f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36500 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
36510 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63  =0 );..    j = c
36520 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
36530 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
36540 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
36550 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
36560 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
36570 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
36580 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
36590 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
365a0 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
365b0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e      assert( i<nN
365c0 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c  ew-1 || j==nCell
365d0 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43   );.    if( j<nC
365e0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
365f0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
36600 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
36610 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
36620 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
36630 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
36640 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
36650 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
36660 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
36670 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
36680 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69   = &aOvflSpace[i
36690 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20  OvflSpace];.    
366a0 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
366b0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
366c0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
366d0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
366e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
366f0 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
36700 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
36710 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
36720 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
36730 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
36740 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
36750 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
36760 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
36770 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
36780 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
36790 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
367a0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
367b0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
367c0 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
367d0 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
367e0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
367f0 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
36800 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
36810 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
36820 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
36830 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
36840 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
36850 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
36860 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
36870 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
36880 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20  emp;.        sz 
36890 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28  = 4 + putVarint(
368a0 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e  &pCell[4], info.
368b0 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70  nKey);.        p
368c0 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
368d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
368e0 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
368f0 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61     /* Obscure ca
36900 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d  se for non-leaf-
36910 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74  data trees: If t
36920 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c  he cell at pCell
36930 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   was.        ** 
36940 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65  previously store
36950 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65  d on a leaf node
36960 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74  , and its report
36970 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20  ed size was 4.  
36980 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20        ** bytes, 
36990 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75  then it may actu
369a0 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20  ally be smaller 
369b0 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20  than this .     
369c0 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65     ** (see btree
369d0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
369e0 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
369f0 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
36a00 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
36a10 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
36a20 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
36a30 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
36a40 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
36a50 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
36a60 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
36a70 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
36a80 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
36a90 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
36aa0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
36ab0 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
36ac0 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
36ad0 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
36ae0 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
36af0 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
36b00 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
36b10 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
36b20 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
36b30 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
36b40 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
36b50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
36b60 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
36b70 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
36b80 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
36b90 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
36ba0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
36bb0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
36bc0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
36bd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36be0 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20    iOvflSpace += 
36bf0 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
36c00 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f  ( sz<=pBt->maxLo
36c10 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20  cal+23 );.      
36c20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61  assert( iOvflSpa
36c30 63 65 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  ce <= (int)pBt->
36c40 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
36c50 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
36c60 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
36c70 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70  ll, sz, pTemp, p
36c80 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  New->pgno, &rc);
36c90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
36ca0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
36cb0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
36cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
36cd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36ce0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
36cf0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
36d00 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78     j++;.      nx
36d10 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Div++;.    }.  }
36d20 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43  .  assert( j==nC
36d30 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
36d40 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73   nOld>0 );.  ass
36d50 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
36d60 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20   if( (pageFlags 
36d70 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29  & PTF_LEAF)==0 )
36d80 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64  {.    u8 *zChild
36d90 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d   = &apCopy[nOld-
36da0 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20  1]->aData[8];.  
36db0 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b    memcpy(&apNew[
36dc0 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nNew-1]->aData[8
36dd0 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20  ], zChild, 4);. 
36de0 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74   }..  if( isRoot
36df0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
36e00 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  ll==0 && pParent
36e10 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e  ->hdrOffset<=apN
36e20 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a  ew[0]->nFree ){.
36e30 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
36e40 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
36e50 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  ee now contains 
36e60 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e  no cells. The on
36e70 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  ly sibling.    *
36e80 2a 20 70 61 67 65 20 69 73 20 74 68 65 20 72 69  * page is the ri
36e90 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65  ght-child of the
36ea0 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68   parent. Copy th
36eb0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
36ec0 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70  e.    ** child p
36ed0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72  age into the par
36ee0 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20  ent, decreasing 
36ef0 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67  the overall heig
36f00 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ht of the.    **
36f10 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
36f20 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69  e by one. This i
36f30 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20 74  s described as t
36f40 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c  he "balance-shal
36f50 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75  lower".    ** su
36f60 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73  b-algorithm in s
36f70 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ome documentatio
36f80 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  n..    **.    **
36f90 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
36fa0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
36fb0 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ase, the call to
36fc0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
36fd0 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  () .    ** sets 
36fe0 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
36ff0 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
37000 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  nding to databas
37010 65 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20  e image pages . 
37020 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20     ** for which 
37030 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
37040 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  tored within the
37050 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63   content being c
37060 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  opied..    **.  
37070 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
37080 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72  assert below ver
37090 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
370a0 68 69 6c 64 20 70 61 67 65 20 69 73 20 64 65 66  hild page is def
370b0 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a  ragmented.    **
370c0 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73   (it must be, as
370d0 20 69 74 20 77 61 73 20 6a 75 73 74 20 72 65 63   it was just rec
370e0 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e 67  onstructed using
370f0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29   assemblePage())
37100 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
37110 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68   important if th
37120 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 68 61  e parent page ha
37130 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65  ppens to be page
37140 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
37150 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e  se.    ** image.
37160 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
37170 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20   nNew==1 );.    
37180 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d  assert( apNew[0]
37190 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20  ->nFree == .    
371a0 20 20 20 20 28 67 65 74 32 62 79 74 65 28 26 61      (get2byte(&a
371b0 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35  pNew[0]->aData[5
371c0 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c  ])-apNew[0]->cel
371d0 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d  lOffset-apNew[0]
371e0 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20  ->nCell*2) .    
371f0 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43  );.    copyNodeC
37200 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c  ontent(apNew[0],
37210 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a   pParent, &rc);.
37220 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4e      freePage(apN
37230 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d  ew[0], &rc);.  }
37240 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f 56  else if( ISAUTOV
37250 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  ACUUM ){.    /* 
37260 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Fix the pointer-
37270 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
37280 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68  all the cells th
37290 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64 20  at were shifted 
372a0 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20  around. .    ** 
372b0 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61  There are severa
372c0 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  l different type
372d0 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s of pointer-map
372e0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65   entries that ne
372f0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
37300 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
37310 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65  is routine. Some
37320 20 6f 66 20 74 68 65 73 65 20 68 61 76 65 20 62   of these have b
37330 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c  een set already,
37340 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   but.    ** many
37350 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66   have not. The f
37360 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75  ollowing is a su
37370 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20  mmary:.    **.  
37380 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e    **   1) The en
37390 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
373a0 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e   with new siblin
373b0 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  g pages that wer
373c0 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20  e not.    **    
373d0 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20    siblings when 
373e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
373f0 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20  s called. These 
37400 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20  have already.   
37410 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65   **      been se
37420 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64  t. We don't need
37430 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20   to worry about 
37440 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61  old siblings tha
37450 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20  t were.    **   
37460 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20     moved to the 
37470 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20  free-list - the 
37480 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65 20  freePage() code 
37490 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20  has taken care. 
374a0 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68     **      of th
374b0 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ose..    **.    
374c0 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e  **   2) The poin
374d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
374e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
374f0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
37500 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70  ow.    **      p
37510 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66  age in any overf
37520 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64 20  low chains used 
37530 62 79 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  by new divider c
37540 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20  ells. These .   
37550 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c   **      have al
37560 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  so already been 
37570 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79  taken care of by
37580 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
37590 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  ) code..    **. 
375a0 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68     **   3) If th
375b0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
375c0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
375d0 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
375e0 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20  ages of.    **  
375f0 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64      cells stored
37600 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20   on the sibling 
37610 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74  pages may need t
37620 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
37630 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29    **.    **   4)
37640 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
37650 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e  pages are not in
37660 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f  ternal intkey no
37670 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20  des, then any.  
37680 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66 6c    **      overfl
37690 6f 77 20 70 61 67 65 73 20 75 73 65 64 20 62 79  ow pages used by
376a0 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61 79   these cells may
376b0 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
376c0 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ted.    **      
376d0 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79  (internal intkey
376e0 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f 6e   nodes never con
376f0 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
37700 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
37710 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
37720 20 20 35 29 20 49 66 20 74 68 65 20 73 69 62 6c    5) If the sibl
37730 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
37740 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
37750 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
37760 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72 69     **      entri
37770 65 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  es for the right
37780 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 20  -child pages of 
37790 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61 79  each sibling may
377a0 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20 20   need.    **    
377b0 20 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e    to be updated.
377c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
377d0 61 73 65 73 20 31 20 61 6e 64 20 32 20 61 72 65  ases 1 and 2 are
377e0 20 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f 76   dealt with abov
377f0 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 2e  e by other code.
37800 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   The next.    **
37810 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
37820 68 20 63 61 73 65 73 20 33 20 61 6e 64 20 34 20  h cases 3 and 4 
37830 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74 65  and the one afte
37840 72 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e 20  r that, case 5. 
37850 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65 74  Since.    ** set
37860 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d  ting a pointer m
37870 61 70 20 65 6e 74 72 79 20 69 73 20 61 20 72 65  ap entry is a re
37880 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69  latively expensi
37890 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68  ve operation, th
378a0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f  is.    ** code o
378b0 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72  nly sets pointer
378c0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
378d0 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c   child or overfl
378e0 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 68 61  ow pages that ha
378f0 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  ve.    ** actual
37900 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e  ly moved between
37910 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20   pages.  */.    
37920 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
37930 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65  apNew[0];.    Me
37940 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
37950 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74  Copy[0];.    int
37960 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c   nOverflow = pOl
37970 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
37980 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d    int iNextOld =
37990 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e   pOld->nCell + n
379a0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e  Overflow;.    in
379b0 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e  t iOverflow = (n
379c0 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d  Overflow ? pOld-
379d0 3e 61 69 4f 76 66 6c 5b 30 5d 20 3a 20 2d 31 29  >aiOvfl[0] : -1)
379e0 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20  ;.    j = 0;    
379f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
37a10 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e  ent 'old' siblin
37a20 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20  g page */.    k 
37a30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
37a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a50 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77   /* Current 'new
37a60 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
37a70 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
37a80 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
37a90 20 20 20 20 69 6e 74 20 69 73 44 69 76 69 64 65      int isDivide
37aa0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  r = 0;.      whi
37ab0 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20  le( i==iNextOld 
37ac0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
37ad0 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
37ae0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
37af0 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
37b00 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20  cell on old.    
37b10 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
37b20 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69  age j. If the si
37b30 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
37b40 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
37b50 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
37b60 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
37b70 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76 69  ell i was a divi
37b80 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  der cell. */.   
37b90 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 2b 31       assert( j+1
37ba0 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 70 43   < ArraySize(apC
37bb0 6f 70 79 29 20 29 3b 0a 20 20 20 20 20 20 20 20  opy) );.        
37bc0 61 73 73 65 72 74 28 20 6a 2b 31 20 3c 20 6e 4f  assert( j+1 < nO
37bd0 6c 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  ld );.        pO
37be0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d  ld = apCopy[++j]
37bf0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f  ;.        iNextO
37c00 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ld = i + !leafDa
37c10 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ta + pOld->nCell
37c20 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   + pOld->nOverfl
37c30 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
37c40 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  pOld->nOverflow 
37c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
37c60 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
37c70 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
37c80 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20      iOverflow = 
37c90 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
37ca0 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3b  pOld->aiOvfl[0];
37cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37cc0 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21     isDivider = !
37cd0 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20  leafData;  .    
37ce0 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
37cf0 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  t(nOverflow>0 ||
37d00 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a   iOverflow<i );.
37d10 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
37d20 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64  erflow<2 || pOld
37d30 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 70 4f 6c  ->aiOvfl[0]==pOl
37d40 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 2d 31 29 3b  d->aiOvfl[1]-1);
37d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
37d60 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c  verflow<3 || pOl
37d70 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 3d 3d 70 4f  d->aiOvfl[1]==pO
37d80 6c 64 2d 3e 61 69 4f 76 66 6c 5b 32 5d 2d 31 29  ld->aiOvfl[2]-1)
37d90 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
37da0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
37db0 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
37dc0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  1;.        if( (
37dd0 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29  --nOverflow)>0 )
37de0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  {.          iOve
37df0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20  rflow++;.       
37e00 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
37e10 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b    if( i==cntNew[
37e20 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  k] ){.        /*
37e30 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
37e40 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
37e50 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
37e60 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20  st cell on new. 
37e70 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
37e80 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65  g page k. If the
37e90 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
37ea0 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
37eb0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
37ec0 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
37ed0 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69  n cell i is a di
37ee0 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a  vider cell.  */.
37ef0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61          pNew = a
37f00 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20  pNew[++k];.     
37f10 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61     if( !leafData
37f20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
37f30 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
37f40 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20  t( j<nOld );.   
37f50 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65     assert( k<nNe
37f60 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w );..      /* I
37f70 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f  f the cell was o
37f80 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65  riginally divide
37f90 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e  r cell (and is n
37fa0 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20  ot now) or.     
37fb0 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   ** an overflow 
37fc0 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20  cell, or if the 
37fd0 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64  cell was located
37fe0 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
37ff0 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  sibling.      **
38000 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65   page before the
38010 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e   balancing, then
38020 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
38030 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
38040 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ted.      ** wit
38050 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f  h any child or o
38060 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65  verflow pages ne
38070 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
38080 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
38090 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c  isDivider || pOl
380a0 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  d->pgno!=pNew->p
380b0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  gno ){.        i
380c0 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
380d0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
380e0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
380f0 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69  et4byte(apCell[i
38100 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
38110 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
38120 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
38130 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
38140 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  [i]>pNew->minLoc
38150 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
38160 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
38170 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d  (pNew, apCell[i]
38180 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
38190 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
381a0 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f  .    if( !leafCo
381b0 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
381c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
381d0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
381e0 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62   u32 key = get4b
381f0 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61  yte(&apNew[i]->a
38200 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
38210 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
38220 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52   key, PTRMAP_BTR
38230 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  EE, apNew[i]->pg
38240 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
38250 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
38260 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70     /* The ptrmap
38270 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e  CheckPages() con
38280 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73  tains assert() s
38290 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76  tatements that v
382a0 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a  erify that.    *
382b0 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61  * all pointer ma
382c0 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20  p pages are set 
382d0 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20  correctly. This 
382e0 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65  is helpful while
382f0 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69   .    ** debuggi
38300 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  ng. This is usua
38310 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63  lly disabled bec
38320 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64  ause a corrupt d
38330 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20  atabase may.    
38340 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65  ** cause an asse
38350 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74  rt() statement t
38360 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20  o fail.  */.    
38370 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
38380 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  (apNew, nNew);. 
38390 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
383a0 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29  ges(&pParent, 1)
383b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
383c0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
383d0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41  >isInit );.  TRA
383e0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
383f0 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e  nished: old=%d n
38400 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
38410 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c  ",.          nOl
38420 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
38430 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65  ;..  /*.  ** Cle
38440 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
38450 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62